2016-08-24 1 views
1

Я пишу сценарий оболочки для использования в inittab. Этот скрипт запускает демона и ждет его завершения.Ждите последнего созданного процесса (daemon, который вилки) до конца

Вот что я в настоящее время:

#!/bin/bash 

/usr/local/bin/mydaemon --lots_of_params_here 
while kill -0 `echo $!` 2> /dev/null; do sleep 1; done; 

Проблема заключается во второй строке; он сразу возвращается. Если я вместо этого сделать:

while kill -0 `pgrep mydaemon` 2> /dev/null; do sleep 1; done; 

Это все работает нормально, но это не является хорошим решением для меня, как у меня есть другие сценарии с префиксом mydaemon.

Что я делаю неправильно?

EDIT:

Проблема, как представляется, связана с демоном вилкой(). Итак, я всегда получаю родительский pid в $!. Я ищу способы решить эту проблему. Может быть, я должен использовать файлы pid и есть mydaemon напишите его pid.

+1

Можете ли вы сделать своего демона не вилкой? Если вам все равно понадобится этот скрипт, работающий во время запуска вашего демона, просто запустите демон в фоновом режиме с помощью оператора «&» в сценарии оболочки и не создавайте вилку демона. (В этом случае вы также можете использовать командную оболочку «wait» вместо того, чтобы цитировать опрос демона, который все еще находится вокруг. – nos

+0

Я никогда не думал об этом. Но это не двойная стандартная практика практики демона (чтобы убедиться, что демон запущен успешно и отсоединиться от терминала)? – Zaxter

+1

Возможно, но ваше требование - не отсоединяться от терминала, а использовать демон в фоновом режиме в сценарии, - так вот что должен делать ваш демон. Если вам нужны обе возможности, ваш daemon возьмет параметр командной строки, который сообщает об этом в fork (или нет). – nos

ответ

2

Вы можете сделать следующий путь, чтобы решить вашу проблему.

#!/bin/bash 
/usr/local/bin/mydaemon --lots_of_params_here & 
wait $! 

wait команда будет ждать до завершения процесса и выходит.

Если вы хотите подождать после некоторых других команд, вы можете сохранить PID в любой другой переменной и использовать это.

#!/bin/bash 
/usr/local/bin/mydaemon --lots_of_params_here & 
mypid=$! 
### Some other commands 
wait $mypid 
+0

Спасибо за ваш ответ Шрихарша. Ваше решение будет работать для большинства программ (как и в моем первоначальном вопросе). К сожалению, это не будет работать с демонами, что вилка, как я упоминаю в своем редактировании. – Zaxter

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