Подтвердить что ты не робот

Выполнять параллельные несколько команд одновременно в одном и том же терминале

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

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

4b9b3361

Ответ 1

Этот bash script предназначен для N параллельных потоков. Каждый аргумент - это команда.

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

#!/bin/bash

for cmd in "[email protected]"; 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";

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

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

Пример:

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

Начните 4 параллельного сна и дождитесь завершения "сна 4".

Ответ 2

Основано на комментарии @alessandro-pezzato. Запустите несколько команд, используя & между командами.

Пример:

$ sleep 3 & sleep 5 & sleep 2 &

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

Ответ 3

Использование параллельного интерфейса GNU:

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

Чтобы убить:

parallel ::: command1 command2 &
PID=$!
kill -TERM $PID
kill -TERM $PID

Ответ 4

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

sleep%:
        sleep $(subst sleep,,[email protected])
        @echo [email protected] 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

Ответ 5

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

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

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

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

Команды префикса могут быть выполнены с помощью:

par "PARPREFIX=[script1] script1.sh" "script2.sh" "script3.sh"

Ответ 6

Чтобы запустить несколько команд, просто добавьте && между двумя командами, подобными этому: command1 && command2

И если вы хотите запустить их в двух разных терминалах, сделайте следующее:

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

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

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