У меня есть несколько конфигов Upstart, которые используются для запуска некоторых передних планов и блокирования процессов в фоновом режиме как некие "демоны", особенно те процессы, которые ни в коем случае не ветвятся. Я хочу перезапустить их автоматически, если они выходят по неизвестной причине, поэтому я настроил respawn , но поскольку эти процессы не выполняются, я не настроил expect . Казалось, это сработало, как и ожидалось, но недавно я кое-что изменил, а сегодня снова наткнулся на что-то в кулинарной книге Upstart, что заставило меня задуматься ...
Если вы не укажете ожидаемый раздел, Upstart будет отслеживать жизненный цикл первого PID, который он выполняет в разделах exec или script.
Я использую раздел script для создания classpath для моего "демона" и недавно добавил, что некоторые ожидают, пока Postgres и / или некоторые веб-приложения будут готовы и впоследствии выполнят мой процесс, используя exec в этом разделе script . Для ожидания я использовать такие инструменты , как ps и curl потому что я забыл про "первого PID вещь" и , кажется, путают выскочка exec с этим оболочки , выполняющей script
Один пример конфигурации:
script
waitForPostgres()
{
while [ true ]
do
# http://superuser.com/questions/597549/grep-fails-in-upstart-script
if ps ax | grep "[p]ostgres: wal writer process" > /dev/null
then
break
fi
sleep 10s
done
}
waitForPostgres
cd "$basePath"
CLASSPATH=$basePath/lib
for i in `ls $basePath/lib/*.jar`
do
CLASSPATH=$CLASSPATH:$i
done
export CLASSPATH
exec java [...]
end script
waitForPostgres является новой, и, насколько я понимаю, все остальное - встроенные оболочки, и без waitForPostgres первый исполняемый и, следовательно, отслеживаемый процесс должен быть java . Но с моей дополнительной функцией я подозреваю, что Upstart вместо этого отслеживает ps и это явно не то, что я хочу.
Итак, какой PID отслеживается в этом примере, ps , grep или java и почему?
И если не отслеживается java есть какие-нибудь идеи для обхода, чтобы отслеживать этот последний PID вместо первого?
Спасибо!
