У меня есть простой сценарий bash, который я написал, чтобы упростить некоторые работы, которые я делаю. Все, что нужно сделать, это запустить один процесс, process_1
, в качестве фонового процесса, затем запустить другой, process_2
. Как только process_2
закончен, мне тогда необходимо завершить process_1
.Убивать не убивающий процесс, если правильно выходить
process_1
запускает программу, которая фактически не останавливается, если она не принимает сигнал уничтожения, или CTRL + C, когда я запускаю ее сам. Программа выводится в файл через {program} {args} > output_file
process_2
может занимать произвольное количество времени в зависимости от аргументов, которые он задает.
Код:
#!/bin/bash
#Call this on exit to kill all background processes
function killJobs() {
#Check process is still running before killing
if kill -0 "$PID"; then
kill $PID
fi
}
... Проверьте данные рассуждения справедливы ...
#Start process_1
eval "./process_1 ${Arg1} ${Arg2} ${Arg3}" &
PID=$!
#Lay a trap to catch any exits from script
trap killJobs TERM INT
#Start process_2 - sleep for 5 seconds before and after
#Need space between process_1 and process_2 starting and stopping
sleep 5
eval "./process_2 ${Arg1} ${Arg2} ${Arg3} ${Arg4} 2> ${output_file}"
sleep 5
#Make sure background job is killed on exit
killJobs
проверить process_1
было прекращено путем проверки его выходного файла еще обновляется после моего сценария закончилось.
Если я запустил сценарий, а затем нажмите CTRL + C, сценарий будет завершен, а process_1
также будет убит, выходной файл больше не обновляется.
Если я позволю сценарию выполнить свое завершение без моего вмешательства process_2
, и скрипт завершается, но когда я проверяю вывод с process_1
, он все еще обновляется.
Чтобы проверить это, я помещаю оператор эха сразу после запуска process_1
и другого внутри оператора if из killJobs
, поэтому он будет отображаться только в том случае, если вызывается kill $PID
.
Выполнение этого Я вижу, что оба способа выхода из старта process_1
, а затем также введите оператор if, чтобы его убить. Однако убийство фактически не убивает процесс в случае обычного выхода. Сообщения об ошибках не создаются.
Немного оффтопик, но зачем использовать '' 'eval'''? – dekkard
Я хотел знать, как выполнить такую программу, как вы бы создали терминал, и это решение, которое я нашел в Интернете. Я открыт для предложений, если другой способ лучше. – Grailor