26 нояб. 2012 г., 13:00 от Alessandro PezzatoOliver Zheng

Запускать несколько команд одновременно в одном терминале

Я хочу выполнить несколько команд, каждая из которых не завершится, пока не будет нажата Ctrl-C. Есть ли что-то, что я могу запустить, чтобы запустить все из них одновременно, и Ctrl-C завершит их все? Они могут совместно использовать вывод терминала.

В частности, у меня есть компасный компилятор, компилятор coffeescript и специальная команда, которая отслеживает изменения файлов, все они работают, следя за изменениями файлов. Я не хочу загружать терминал для каждой команды.

Ответы на вопрос (0)

06 июн. 2012 г., 13:23 от Alessandro Pezzato

ент является командой.

trap убьет все подпроцессы, когда SIGINT пойман.
wait $PID_LIST ожидает завершения каждого процесса. Когда все процессы завершены, программа завершает работу.

#!/bin/bash

for cmd in "$@"; do {
  echo "Process \"$cmd\" started";
  $cmd & pid=$!
  PID_LIST+=" $pid";
} done

trap "kill $PID_LIST" SIGINT

echo "Parallel processes have started";

wait $PID_LIST

echo
echo "All processes have completed";

Сохраните этот скрипт какparallel_commands и сделай его исполняемым.
Вот как использовать этот скрипт:

parallel_commands "cmd arg0 arg1 arg2" "other_cmd arg0 arg2 arg3"

Пример

parallel_commands "sleep 1" "sleep 2" "sleep 3" "sleep 4"

Начинайте 4 параллельного сна и ждите, пока закончится «сон 4».

24 июл. 2016 г., 22:51 от greuze

для запуска нескольких команд, просто используйте&, между командами.

Пример

$ sleep 3 & sleep 5 & sleep 2 &

Он будет запускать команды в фоновом режиме.

11 апр. 2018 г., 19:00 от hiroshi

Это можно сделать с помощью простого Makefile:

sleep%:
        sleep $(subst sleep,,$@)
        @echo $@ done.

Используйте-j вариант.

$ make -j sleep3 sleep2 sleep1
sleep 3
sleep 2
sleep 1
sleep1 done.
sleep2 done.
sleep3 done.

Без-j опция выполняется в сериале.

$ make -j sleep3 sleep2 sleep1
sleep 3
sleep3 done.
sleep 2
sleep2 done.
sleep 1
sleep1 done.

Вы также можете выполнить пробный запуск с параметром `-n '.

$ make -j -n sleep3 sleep2 sleep1
sleep 3
sleep 2
sleep 1
25 июл. 2014 г., 23:22 от Ole Tange

Используйте GNU Parallel:

(echo command1; echo command2) | parallel
parallel ::: command1 command2

Убить

parallel ::: command1 command2 &
PID=$!
kill -TERM $PID
kill -TERM $PID
10 апр. 2015 г., 12:19 от Kostiantyn Rybnikov

которую я только что написал. В настоящее время он называется par, но скоро будет переименован в parl или pll, еще не решил.

https: //github.com/k-bx/pa

API так же прост, как:

par "script1.sh" "script2.sh" "script3.sh"

оманды @Prefixing могут быть выполнены через:

par "PARPREFIX=[script1] script1.sh" "script2.sh" "script3.sh"
03 июн. 2017 г., 16:28 от zsmb13

&& между двумя командами вот так:command1 && command2

А если вы хотите запустить их в двух разных терминалах, то вы делаете это так:

gnome-terminal -e "command1" && gnome-terminal -e "command2"

Это откроет 2 терминала сcommand1 а такжеcommand2 исполняется в них.

Надеюсь, это поможет тебе.

ВАШ ОТВЕТ НА ВОПРОС