Может ли выскочить ожидание/респаун для процессов, которые развиваются более чем в два раза?
Я использую upstart для запуска/остановки/автоматического перезапуска демонов. Один из демонов вилки 4 раза. кулинарная книга для выскочек утверждает, что она поддерживает только двухстороннюю поддержку. Есть ли способ обхода?
Как это не удается
Если я пытаюсь использовать expect daemon
или expect fork
, upstart использует pid второй вилки. Когда я пытаюсь остановить работу, никто не реагирует на выскочку сигнала SIGKILL, и он зависает, пока вы не исчерпаете пространство pid и не оборветесь назад. Хуже, если добавить респаун. Upstart считает, что работа умерла и сразу же начинается еще одна.
Ошибка, подтвержденная восходящим потоком
Была введена ошибка для выскочки. Представленные решения включают в себя старый sysvinit, переписывают вашего демона или ждут повторной записи. RHEL близок к 2 годам за последним пакетом upstart, поэтому к тому времени, когда релиз будет выпущен, и мы получим обновление, ждать будет, вероятно, 4 года. Демон написан субподрядчиком субподрядчика подрядчика, поэтому он также не будет исправлен в ближайшее время.
Ответы
Ответ 1
Я придумал уродливый взломать эту работу. Он работает для моего приложения в моей системе. YMMV.
- запустите приложение в разделе предварительного запуска
- в разделе script выполните script, который работает до тех пор, пока выполняется приложение. Pid этого script - это то, что будет отслеживать выскочка.
- в разделе после остановки уничтожает приложение
Пример
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.