Можно ли использовать ожидание / возрождение для процессов, которые разветвляются более двух раз?
Я использую upstart для запуска / остановки / автоматического перезапуска демонов. Один из демонов разветвляется 4 раза. В готовой поваренной книге говорится, что она поддерживает только разветвление дважды. Есть ли обходной путь?
Как это не удается
Если я попытаюсь использовать expect daemon
или же expect fork
upstart использует pid второго форка. Когда я пытаюсь остановить работу, никто не отвечает на сигнал выскочки SIGKILL, и он зависает, пока вы не исчерпаете пространство пида и не вернетесь назад. Будет хуже, если вы добавите респаун. Выскочка думает, что работа умерла и немедленно начинает другую.
Ошибка подтверждена апстримом
Ошибка была введена для выскочки. Представленные решения - придерживаться старого sysvinit, переписать свой демон или дождаться переписывания. RHEL почти на 2 года отстает от последнего пакета upstart, поэтому к тому времени, когда переиздание будет выпущено, и мы получим обновление, ожидание, вероятно, составит 4 года. Демон написан субподрядчиком субподрядчика подрядчика, поэтому он также не будет исправлен в ближайшее время.
1 ответ
Я придумал уродливый хак, чтобы сделать эту работу. Это работает для моего приложения в моей системе. YMMV.
- Запустите приложение в разделе предварительного запуска
- в разделе сценариев запустите сценарий, который выполняется до тех пор, пока работает приложение. Pid этого скрипта - это то, что выскочка будет отслеживать.
- в разделе пост-стоп убить приложение
пример
env DAEMON=/usr/bin/forky-application
pre-start script
su -s /bin/sh -c "$DAEMON" joeuseraccount
end script
script
sleepWhileAppIsUp(){
while pidof $1 >/dev/null; do
sleep 1
done
}
sleepWhileAppIsUp $DAEMON
end script
post-stop script
if pidof $DAEMON;
then
kill `pidof $DAEMON`
#pkill $DAEMON # post-stop process (19300) terminated with status 1
fi
end script
аналогичный подход может быть использован с файлами pid.