Можно ли использовать ожидание / возрождение для процессов, которые разветвляются более двух раз?

Я использую upstart для запуска / остановки / автоматического перезапуска демонов. Один из демонов разветвляется 4 раза. В готовой поваренной книге говорится, что она поддерживает только разветвление дважды. Есть ли обходной путь?

Как это не удается

Если я попытаюсь использовать expect daemon или же expect forkupstart использует pid второго форка. Когда я пытаюсь остановить работу, никто не отвечает на сигнал выскочки SIGKILL, и он зависает, пока вы не исчерпаете пространство пида и не вернетесь назад. Будет хуже, если вы добавите респаун. Выскочка думает, что работа умерла и немедленно начинает другую.

Ошибка подтверждена апстримом

Ошибка была введена для выскочки. Представленные решения - придерживаться старого sysvinit, переписать свой демон или дождаться переписывания. RHEL почти на 2 года отстает от последнего пакета upstart, поэтому к тому времени, когда переиздание будет выпущено, и мы получим обновление, ожидание, вероятно, составит 4 года. Демон написан субподрядчиком субподрядчика подрядчика, поэтому он также не будет исправлен в ближайшее время.

1 ответ

Решение

Я придумал уродливый хак, чтобы сделать эту работу. Это работает для моего приложения в моей системе. YMMV.

  1. Запустите приложение в разделе предварительного запуска
  2. в разделе сценариев запустите сценарий, который выполняется до тех пор, пока работает приложение. Pid этого скрипта - это то, что выскочка будет отслеживать.
  3. в разделе пост-стоп убить приложение

пример

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.

Другие вопросы по тегам