2016-03-22 1 views
0

У меня есть простой сценарий 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, чтобы его убить. Однако убийство фактически не убивает процесс в случае обычного выхода. Сообщения об ошибках не создаются.

+0

Немного оффтопик, но зачем использовать '' 'eval'''? – dekkard

+0

Я хотел знать, как выполнить такую ​​программу, как вы бы создали терминал, и это решение, которое я нашел в Интернете. Я открыт для предложений, если другой способ лучше. – Grailor

ответ

1

Вы столкнулись с eval вместо process_1, который устанавливает $! к PID самого скрипта, а не к process_1. Перейдите на:

#!/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 
} 
...Check given arguments are valid... 

#Start process_1 
./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 
./process_2 ${Arg1} ${Arg2} ${Arg3} ${Arg4} 2> ${output_file} 
sleep 5 

#Make sure background job is killed on exit 
killJobs 
+0

Это не сработало, я все равно получаю ту же проблему – Grailor

+0

Я обновил ответ. Это работает? – webb

+0

По-прежнему не работает, к сожалению – Grailor

 Смежные вопросы

  • Нет связанных вопросов^_^