Выполнять параллельные несколько команд одновременно в одном и том же терминале
Я хочу запустить несколько команд, каждая из которых не заканчивается до нажатия Ctrl-C. Есть ли что-то, что я могу запустить, чтобы запустить все из них сразу, и Ctrl-C покинет их всех? Они могут совместно использовать вывод терминала.
В частности, у меня есть компас компас, компилятор coffeescript и пользовательская команда, которая следит за изменениями файлов, которые все работают, наблюдая за изменениями файлов. Я не хочу загружать терминал для каждой команды.
Ответы
Ответ 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
, выполняющими в них.
Надеюсь, это поможет вам.