2013-08-19 4 views
2

У меня есть скрипт, который запускает многие процессы в фоновом режиме и использует поЬир, чтобы убедиться, что эти процессы продолжает работать -Запуск фонового процесса Unix поддержания порядка

nohup "./$__service_script1.pl" $__service_args </dev/null> /var/log/$__service_name.log 2>&1 & 

Проблема является для меня важно, чтобы убедиться, что процессы начинаются в порядке их вызова. Их способ подождать, пока процесс определенно не начался, прежде чем пытаться начать другой процесс?

Я попытался подождать, но он ждет, пока процесс не завершится, я просто хочу убедиться, что процесс запущен. Вероятно, самым простым решением было бы поспать в течение нескольких секунд между процессами, есть ли лучшее решение?

Благодаря

+2

Другим наивным решением будет опрос 'ps | grep $ __ service_name' для соответствующей записи, стараясь не получить «nohup». Или вы можете добавить дополнительный уровень загрузки, создав программу для fork и запустив службу, дождитесь появления PID, а затем уведомите сценарий инициализации. Имейте в виду, что как только один из ваших сервисов должен быть перезапущен, он будет не в порядке. Это может произойти даже при первом запуске. – paddy

+2

Назовите их одним скриптом _umbrella_ master и только NOHUP - мастер-скрипт? (или объединить их всех и называть целую связку. Или их цепочка) – wildplasser

+0

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

ответ

1

Это зависит от того, что вы подразумеваете под «определенно начал». Если вы имеете в виду, что fork (2) завершен и новый процесс существует, то каждый процесс запускается к моменту возвращения nohup. Создан новый процесс.

Проблема, с которой вы сталкиваетесь, заключается в том, что нет гарантии того, как долго процесс nohup'ed будет запущен до возвращения оболочки. Когда процесс, который вы запускаете, «определенно запущен», зависит от того, что процесс делает для инициализации. Если у вас нет источника приложений или вы не можете их модифицировать по какой-либо другой причине, вы будете ограничены просмотром их результатов. Многие демоны выведут сообщение журнала на разных этапах их инициализации. Вы можете изменить свой скрипт для

  1. Посмотрите на лог-файл, и создать пустую, если он не существует
  2. Откройте файл журнала для чтения (в конце концов, чтобы избежать ложных сообщений из предыдущих вызовов), наблюдая за лог сообщения, который указывает процесс начался,
  3. начать процесс с поЬир,
  4. Дождитесь файла журнала Watcher

В Баш, это будет выглядеть как это могло бы работать (этот код является совершенно непроверенные):

log=<path to log file> 
msg=<message service prints when it is ready> 
svc=<path to service> 

# Create log file if it does not exist 
if [ ! -f "$log" ] ; then 
    echo > "$log" 
fi 

# watch for message to appear on a single line in the log file 
tail -0 -f "$log" | egrep "$msg" | head -1 & 
ready_pid=$! 

# Start the service 
nohup "$svc" </dev/null>> "$log" 2>&1 & 

# Wait for the message 
wait $ready_pid 

Вы хотите начать просмотр файла журнала перед разветвлением службы, потому что в противном случае сообщение может проходить в журнале перед сценарием запуска службы можно прикрепить к файлу журнал.

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