Я хочу запустить две команды одновременно в bash на машине с Linux. Поэтому в моем ./execute.sh
скрипте Bash я положил:
command 1 & command 2
echo "done"
Однако когда я хочу остановить скрипт bash и нажать Ctrl+ C, останавливается только вторая команда. Первая команда продолжает работать. Как мне убедиться, что полный скрипт bash остановлен? Или в любом случае как мне остановить обе команды? Потому что в этом случае, независимо от того, как часто я нажимаю Ctrl+, Cкоманда продолжает работать, и я вынужден закрыть терминал.
Ответы:
Если вы печатаете
это равно
то есть это будет запускать первую команду в фоновом режиме, а затем запускает вторую команду на переднем плане. Особенно это означает, что ваша
echo "done"
распечатана послеcommand 2
завершения, даже еслиcommand 1
все еще работает.Вы, вероятно, хотите
Это запустит обе команды в фоновом режиме и будет ждать завершения обеих команд.
Если вы нажмете CTRL-C, это только отправит сигнал SIGINT на передний план процесса, т.е.
command 2
в вашей версии илиwait
в моей версии.Я бы предложил установить ловушку так:
С помощью ловушки сигнал SIGINT, генерируемый CTRL-C, захватывается и заменяется
killgroup
функцией, которая убивает все эти процессы.источник
set -x
в начале вашего скрипта для печати выполняемых команд.При вводе команды в фоновом режиме из сценария PID не отображается на экране. Вы можете использовать встроенную переменную,
$!
которая хранит PID последнего процесса, чтобы вы могли захватить PID команды1.повторил бы PID команды1.
Bash также предоставляет встроенную ловушку, которую вы можете использовать для регистрации последовательности команд, выполняемых при получении определенных сигналов. Вы можете использовать это для перехвата SIGINT и kill command1 перед выходом из основного скрипта, например
Теперь, пока команда 2 выполняется, нажатие Ctrl Cприведет к тому, что и команда 1, и команда 2 будут отправлены SIGINT.
источник
%n
синтаксис для уничтожения определенных фоновых заданий в этой оболочке. Обычно вы выпускаете,kill %1
чтобы убить последний и единственный фоновый процесс. При наличии дополнительных фоновых процессовjobs
сначала используйте список.Более новые версии GNU Parallel будут делать то, что вы хотите:
Или, если
command
остается прежним:Посмотрите вступительное видео для быстрого ознакомления: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
Пройдите учебник (man parallel_tutorial). Ты командная строка с любовью тебя за это.
источник
Ctrl+ Cотправляет сигнал SIGINT на ваш фронт-процесс, который есть
command2
.command1
выполняется в фоновом режиме, поэтому не касается входного потока.Когда вы печатаете
command1 &
, bash должен дать вам PID процесса, что-то вроде[1234]
. Чтобы убить этот процесс, вы можете использоватьkill 1234
. Теперь, если у вас есть PID обоихcommand1
иcommand2
(посмотритеps -ef
), вы можете использоватьkill
для их завершения:Небольшая хитрость - запустить обе команды в фоновом режиме, используя:
Баш даст вам оба идентификатора, готовых быть убитыми. Еще один трюк - вернуть
command1
на передний план, как только вы убьетеcommand2
:Более подробная информация доступна здесь: http://linuxg.net/how-to-manage-background-and-foreground-processes/
источник