У меня есть несколько конфигов 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 вместо первого?
Спасибо!