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

Я хочу запустить несколько команд (процессов) в одной оболочке. Все они имеют собственный непрерывный выход и не останавливаются. Запуск их в фоновом режиме разбивает Ctrl - C . Я хотел бы запустить их как один процесс (может быть?), Чтобы остановить все из них с помощью Ctrl - C .

Чтобы быть конкретным, я хочу запустить модульные тесты с помощью mocha (режим просмотра), запустить сервер и запустить некоторую предварительную обработку файлов (смотреть mode) и просмотреть выходные данные каждого в одном окне терминала. В основном я хочу избежать использования некоторых задач.

Я могу реализовать это, запустив процессы в фоновом режиме (&), но затем я должен поставить их на передний план, чтобы остановить их. Я бы хотел, чтобы процесс их обертывания, и когда я останавливаю процесс, он останавливает своих «детей».

40 голосов | спросил user1876909 20 Mayam15 2015, 08:34:32

3 ответа


15

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

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

Идентификатор группы процессов (PGID) группы процессов является идентификатором процесса исходного родительского процесса в группе. Чтобы убить все процессы в группе процессов, передайте отрицательный результат PGID системному вызову или команде kill. 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 убьет их всех. Используйте встроенный wait, чтобы оболочка ожидала завершения всех команд.

sh -c 'command1 & command2 & command3 & wait'
# Press Ctrl+C to kill them all
ответил Gilles 21 Mayam15 2015, 04:09:00
0

Вы можете использовать точку с запятой ; или && следующим образом:

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.
ответил serenesat 20 Mayam15 2015, 08:54:47
-1

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

1st command | 2nd command | 3rd command

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

ответил haxxor 20 Mayam15 2015, 10:42:19

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132