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

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

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

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

Решение Вопроса

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

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";

Сохраните этот скрипт как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».

 Alessandro Pezzato09 янв. 2014 г., 18:41
Вы хотите STDOUT или выходное значение?
 shgnInc21 нояб. 2013 г., 10:54
Так здорово. Теперь у меня есть несколько команд, которые есть в скрипте bash, и я хочу их запуститьпараллельн?
 Alessandro Pezzato07 июн. 2012 г., 09:58
@ MTsoul,wait лучше, чем цикл while. Я улучшил свой сценарий с вашим предложением. Это также работает для N параллельных команд.
 Oliver Zheng07 июн. 2012 г., 09:11
Очень круто. Ловушка - это то, что я искал. Я отредактировал ваш ответ, чтобы включитьwait, который будет подавлять ненужные сообщения "обработать х вышли".
 user251767604 сент. 2013 г., 23:26
Как насчет запуска каждого cmd на отдельном ядре? Должен ли я работать следующим образом: 1 other_cmd arg0 arg2 arg3 "

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

Пример

$ sleep 3 & sleep 5 & sleep 2 &

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

 nsantana30 июн. 2017 г., 15:43
Hi @OleTange, я не знаю разницы. Я пытался&! а также& и оба работали одинаково.
 nsantana03 июл. 2017 г., 15:27
Спасибо за совет. Я изменяю код и удаляю восклицательный знак.
 Mark Setchell03 июн. 2017 г., 12:45
Я получаю ошибку, если не опущу последний восклицательный знак ...
 T.W.R. Cole06 дек. 2016 г., 23:52
Это то, что я искал.

Это можно сделать с помощью простого 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

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

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

Убить

parallel ::: command1 command2 &
PID=$!
kill -TERM $PID
kill -TERM $PID
 Ole Tange13 окт. 2017 г., 10:30
См. Редактирование, где это убито.
 0atman30 июн. 2015 г., 10:26
 Stefan Majewsky17 мар. 2016 г., 14:31
@ Oatman: Так и должно быть, но параллель с GNU есть не во всех дистрибутивах. Например, RHEL 7, похоже, не имеет готового пакета.
 W.M.13 окт. 2017 г., 10:13
Можно ли отследить PID параллельного процесса, который запускает несколько процессов, и завершить их все путем завершения родительской параллели?

которую я только что написал. В настоящее время он называется 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"
 worldsayshi23 мар. 2016 г., 10:03
После того, как я попытался выполнить то, что вы описали выше, используя параллельную программу gnu, у меня не получилось с первой попытки использовать вашу утилиту. Хорошо сделано
 Ole Tange21 авг. 2016 г., 17:19
Первый:parallel ::: "script1.sh" "script2.sh" "script3.sh" Второй обычно использует --tag:parallel --tag ::: "script1.sh" "script2.sh" "script3.sh"

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

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

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

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

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

 Mark Setchell03 июн. 2017 г., 12:43
Это неверно. Работаетcommand2 посл command1 и только еслиcommand1 успешно. Пытатьсяsleep 3 && sleep 3 и ты увидишь, что это займет 6 секунд.
 Gahan03 июн. 2017 г., 14:17
command1 && command2 не запускается сразу. он будет выполняться один за другим (учитывая сценарий успеха команды).

Ваш ответ на вопрос