2014-02-06 2 views
3

У меня есть программа, для которой я пишу скрипт в формате /etc/init.d.Как ждать запуска программы, а затем ее фон?

Проблема в том, программа не deamonize себя. Это займет 5 секунд, чтобы запустить его, и когда он инициализирован, он печатает строку («Начать OK») на stdout.

Я ищу для создания скрипта, который запускает процесс, ждет, пока строка появится, а затем продолжит выполнение сценария, указывая на неудачу или успех (строка была найдена).

Очевидно, что это не работает, как я хочу.

daemon $PROGRAM & 

Скорее

(./proc > some_output) & 
poll_output_for "Started OK" 10 secs or die 
+0

Я предполагаю, что у вас нет доступа к источнику этой программы? Я был в аналогичной ситуации с wpa_supplicant и dhcpcd, я сделал уродливое решение для статуса опроса для wpa_supplicant, так как он, к счастью, имеет wpa_cli, и когда тот вернул успех, я продолжил. – Jite

+0

это поможет? http://stackoverflow.com/questions/19326245/bash-wait-for-process-start –

+0

Если все остальное не удается, вы можете выполнить './program & sleep 10'. Это дало бы программе время для начала. Но вы не сможете обнаружить отказ таким образом. Я отправляю это как комментарий вместо ответа, потому что это просто обходной путь вместо реального ответа. – Jonathan

ответ

2

Я думаю, что вы могли бы быть в состоянии использовать expect, чтобы сделать что-то вроде этого: см http://expect.sourceforge.net/ или http://en.wikipedia.org/wiki/Expect. Это находится в репозиториях для многих распределений, например. на Ubuntu вы можете apt-get install expect.

Он скрипт для имитации вашего демона:

#/usr/bin/env /bin/bash 
# daemon.sh 

sleep 2 
echo Started OK 
while :; do sleep 1; echo '.' >> daemon.log; done 

... и вот ожидать скрипт, который ждет на выходе, а затем выходит:

#!/usr/bin/env /usr/bin/expect 

spawn -ignore SIGHUP ./daemon.sh 
expect "Started OK" 

Ожидать не возвращается до тех пор, Пришло сообщение «Начать OK». Когда он закрывается, демона получает SIGHUP, но мы проигнорировали его, так что он продолжает работать. Если вы проверите файл журнала (watch cat daemon.log), демон должен быть отброшен.

Я не думаю, что это должно быть слишком сложно, чтобы ожидать возврата соответствующего кода ошибки. Посмотрите man-страницу для получения дополнительной информации.

1

Если я вас понимаю, есть программа, которая запускает 5 или около того секунд, но работает в фоновом режиме. Вам нужно дождаться запуска этой программы, и эта программа по-прежнему будет печатать «Started OK».

Если начинается эта программа, работает в фоновом режиме, но все еще подключен к консоли, так что он может написать в консоли, вы можете быть в состоянии сделать что-то вроде этого:

$prog | tee $prog_out_file 
while true 
do 
    sleep 2 
    grep -q "Started Ok" $prog_out_file && break 
done 
# Continue here... 

Идея заключается в том для продолжения цикла, пока вы не увидите «Started Ok», напечатанный на перенаправленном выходе.

+0

Спасибо, да это работает. Nice, за исключением одного: файл $ prog_out_file нужно удалить или перенаправить обратно обратно в stdout за $ prog. –

+0

Что делать, если вы использовали 'tee'? Я обновил свой пример. –

+0

Хм.Не могли бы вы немного объяснить причину, по которой я не вижу, как здесь может помочь «tee»? Вы имеете в виду убить tee позже (что не будет работать, потому что это убьет прогу, а также сломанную трубу)? –

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