Я хочу запустить несколько команд (процессов) в одной оболочке. Все они имеют собственный непрерывный выход и не останавливаются. Запуск их в фоновом режиме перерывов Ctrl- C. Я хотел бы запустить их как единый процесс (подоболочка, может быть?), Чтобы иметь возможность остановить их все с помощью Ctrl- C.
Если быть точным, я хочу запустить модульные тесты с mocha
(режим просмотра), запустить сервер и запустить некоторую предварительную обработку файлов (режим просмотра) и посмотреть вывод каждого из них в одном окне терминала. В основном я хочу избежать использования какого-либо бегуна задач.
Я могу реализовать это, запустив процессы в фоновом режиме ( &
), но затем мне нужно поместить их на передний план, чтобы остановить их. Я хотел бы иметь процесс, чтобы обернуть их, и когда я остановлю процесс, он остановит своих «детей».
источник
Ответы:
Для одновременного запуска команд вы можете использовать
&
разделитель команд.Это запустится
command1
, затем запустится в фоновом режиме. То же самое сcommand2
. Затем начинаетсяcommand3
нормально.Вывод всех команд будет искажен вместе, но если это не проблема для вас, это было бы решением.
Если вы хотите позже просмотреть отдельный вывод, вы можете направить вывод каждой команды
tee
, что позволит вам указать файл для зеркального отображения вывода.Вывод, вероятно, будет очень грязным. Чтобы противостоять этому, вы можете присвоить выводу каждой команды префикс, используя
sed
.Итак, если мы соберем все это вместе, мы получим:
Это очень идеализированная версия того, что вы, вероятно, увидите. Но это лучшее, что я могу думать прямо сейчас.
Если вы хотите остановить все из них одновременно, вы можете использовать встроенную функцию
trap
.Это будет выполняться
command1
иcommand2
в фоновом режиме, иcommand3
на переднем плане, что позволяет убить его с помощью Ctrl+ C.Когда вы убиваете последний процесс с Ctrl+ Cна
kill %1; kill %2
командах выполняются, потому что мы соединили их исполнение с приемом на ПРЕРЫВАЙТЕ СИГНАЛ, вещь посланного нажатия Ctrl+ C.Они соответственно убивают 1-й и 2-й фоновый процесс (ваш
command1
иcommand2
). Не забудьте удалить ловушку после того, как вы закончите с использованием командtrap - SIGINT
.Полный монстр команды:
Вы могли бы, конечно, взглянуть на экран . Это позволяет вам разделить вашу консоль на столько разных консолей, сколько вы хотите. Таким образом, вы можете контролировать все команды по отдельности, но в то же время.
источник
Вы можете легко убить сразу несколько процессов, если вы организуете их (и только их) в одной группе процессов .
Linux предоставляет утилиту
setsid
для запуска программы в новой группе процессов (даже в новом сеансе, но нас это не волнует). (Это выполнимо, но без него сложнееsetsid
.)Идентификатор группы процессов (PGID) группы процессов - это идентификатор процесса исходного родительского процесса в группе. Чтобы уничтожить все процессы в группе процессов, передайте отрицательное значение PGID
kill
системному вызову или команде. PGID остается действительным, даже если оригинальный процесс с этим PID умирает (хотя это может немного сбивать с толку).Если вы запустите процессы в фоновом режиме из неинтерактивной оболочки, все они останутся в группе процессов оболочки. Только в интерактивных оболочках фоновые процессы выполняются в своей собственной группе процессов. Поэтому, если вы разветвляете команды из неинтерактивной оболочки, которая остается на переднем плане, Ctrl+ Cубьет их всех. Используйте
wait
встроенную функцию, чтобы оболочка ожидала завершения всех команд.источник
Я удивлен, что это еще не здесь, но мой любимый способ сделать это - использовать подоболочки с фоновыми командами. Использование:
(command1 & command2 & command3)
Вывод виден из обоих, все команды bash и удобства все еще доступны, и один Ctrl-cубивает их всех. Я обычно использую это для одновременного запуска клиентского файлового сервера с живой отладкой и внутреннего сервера, поэтому я могу легко убить их обоих, когда захочу.
Как это работает, что
command1
иcommand2
работает в фоновом режиме нового экземпляра подоболочки, иcommand3
на переднем плане этого экземпляра, и подоболочка является то , что первым получает сигнал Разрушитель от Ctrl-cнажатия клавиши. Это очень похоже на запуск bash-скрипта в отношении того, кому принадлежит какой процесс и когда фоновые программы убиваются.источник
wait
окончательную команду (команда 3 в вашем примере), вы можете выполнить код очистки после того, как пользователь нажмет Ctrl-c.Вы можете использовать точку с запятой
;
или&&
как это:источник
Вы можете использовать
pipe
. Это запустит команды на обоих концах трубы одновременно. Вы должны быть в состоянии остановить все команды с помощьюCTRL-C
тоже.1st command | 2nd command | 3rd command
Если вы хотите запускать команды одну за другой, вы можете использовать метод @ serenesat.
источник