Запускать несколько команд и уничтожать их как одну в bash

Так как Вы уже выполняете Arch на своем настольном компьютере, archiso сценарии могли быть тем, что Вы ищете:

Archiso является маленьким набором сценариев удара, который способен к созданию полностью функционального Arch Linux базирующийся живой CD и образы USB. Это - очень универсальный инструмент, таким образом, это могло потенциально использоваться для генерации чего-либо от спасательных систем, дисков установки, к особому интересу живые системы CD/DVD/USB, и кто знает что еще. Проще говоря, если это вовлекает Arch на солнечном каботажном судне, это может сделать это. Основа и душа Archiso являются mkarchiso.

54
21.05.2015, 04:12
4 ответа

Для одновременного выполнения команд вы можете использовать разделитель команд и .

~$ command1 & command2 & command3

Это запустит command1 , а затем запустит ее в фоновом режиме. То же самое с command2 . Затем он запускает command3 в обычном режиме.

Вывод всех команд будет искажен, но если это не проблема для вас, это будет решением.

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

~$ command1 | tee 1.log & command2 | tee 2.log & command3 | tee 3.log

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

~$ echo 'Output of command 1' | sed -e 's/^/[Command1] /' 
[Command1] Output of command 1

Итак, если мы сложим все это вместе, мы получим:

~$ command1 | tee 1.log | sed -e 's/^/[Command1] /' & command2 | tee 2.log | sed -e 's/^/[Command2] /' & command3 | tee 3.log | sed -e 's/^/[Command3] /'
[Command1] Starting command1
[Command2] Starting command2
[Command1] Finished
[Command3] Starting command3

Это в высшей степени идеализированная версия того, что вы, вероятно, увидите. Но это лучшее, о чем я могу думать прямо сейчас.

Если вы хотите остановить их всех сразу, вы можете использовать встроенную ловушку .

~$ trap 'kill %1; kill %2' SIGINT
~$ command1 & command2 & command3

Это выполнит command1 и command2 в фоновом режиме и command3 на переднем плане, что позволит вам убить его с помощью Ctrl + С .

Когда вы убиваете последний процесс с помощью Ctrl + C , kill% 1; Команды kill% 2 выполняются, потому что мы связали их выполнение с приемом INTerupt SIGnal, отправляемого нажатием Ctrl + C .

Они убивают соответственно 1-й и 2-й фоновые процессы (ваши command1 и command2 ). Не забудьте удалить ловушку после того, как вы закончите свои команды, используя ловушку - SIGINT .

Полный монстр команды:

~$ trap 'kill %1; kill %2' SIGINT
~$ command1 | tee 1.log | sed -e 's/^/[Command1] /' & command2 | tee 2.log | sed -e 's/^/[Command2] /' & command3 | tee 3.log | sed -e 's/^/[Command3] /'

Вы, конечно, можете взглянуть на экран . Это позволяет вам разделить вашу консоль на столько отдельных консолей, сколько вам нужно. Таким образом, вы можете отслеживать все команды по отдельности, но одновременно.

68
27.01.2020, 19:33

Вы можете использовать трубу . Это начнет команды на любых концах трубы одновременно. Вы должны быть в состоянии остановить все команды с помощью Ctrl-C .

1-я команда | 2-я команда |. 3RD Command

Если вы хотите запустить команды один за другим, вы можете использовать метод @ Serenesat.

-2
27.01.2020, 19:33

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

Linux предоставляет утилиту setsid для запуска программы в новой группе процессов (в новой сессии, но мы не заботимся об этом). (Это выполнимо , но более сложный без Setsid .) [1263135].)

ID группы процессов (PGID) группы процессов - это идентификатор процесса исходного родительского процесса в группе. Чтобы убить все процессы в группе процессов, пройдите отрицатель PGID в Убить System Call или команд. PGID остается действительным, даже если исходный процесс с этим PID умирает (хотя это может быть немного запутанным).

setsid sh -c 'command1 & command2 & command3' &
pgid=$!
echo "Background tasks are running in process group $pgid, kill with kill -TERM -$pgid"

Если вы запускаете процессы в фоновом режиме из неинтерактивной оболочки, то они все останутся в группе процессов оболочки. Это только в интерактивных снарядах, которые фоновые процессы работают в собственной группе процессов. Поэтому, если вы вилее команды из неинтерактивной оболочки, которые остаются на переднем плане, Ctrl + C убьют их всех. Используйте ждут встроенного, чтобы оболочку ждать всех команд для выхода.

sh -c 'command1 & command2 & command3 & wait'
# Press Ctrl+C to kill them all
22
27.01.2020, 19:33

Вы можете использовать точку с запятой ; Или && , как это:

cmd1; cmd2   # Runs both the commands, even if the first one exits with a non-zero status.

cmd1 && cmd2 # Only runs the second command if the first one was successful.
0
27.01.2020, 19:33

Теги

Похожие вопросы