Как сделать graceful shutdown скриптам, запущенным через forever, при перезагрузке ОС?
Приветствую. Вопрос к тем, кто пользуется forever.
В целом, понятно, что в моём случае forever следует стартовать с --killSignal=SIGTERM.
Тогда, forever stopall отправит в скрипты SIGTERM, а там уж, в обработчике сигнала, я выполняю всё что считаю нужным перед вызовом process.exit(). Но! Если происходит перезагрузка ОС, то это не работает?
Так нет же, я как раз рассчитываю на то, что монитор forever получив SIGTERM либо сам рассылает SIGTERM по контролируемым процессам, либо хотя бы не шлёт им SIGKILL, чтобы они отреагировали на системный SIGTERM.
Если только дело в том, что процессы порождённые forever не получают SIGTERM от системы? А когда я пробую без foverer я запускаю из терминала через nohup, и в этом случае SIGTERM процесс ловит?
alegzz: Как это? Почему же нет? Возможно это настраиваемо, но рассылается. По крайней мере процесс, запущенный в терминале
nohup nodejs app.js 1 >> consolg.log 2 >&1 &
и имеющий в коде обработчик сигнала SIGTERM, получит его при перезагрузке.
alegzz: Вот тут я не уверен, возможно запущенные forever процессы его и не получат. Причина мне не известна. Я полагал, что если они не получают, то forever делает stopAll получая свой SIGTERM. Но в коде видно, что не делает. Вопрос, почему не получают дочерние? Рассылка точно есть.
alegzz: Под init я подразумевал подсистему инициализации linux. При перезагрузке именно она, полагаю, занимается рассылкой SIGTERM. Я не очень разбираюсь в linux, но видимо мой вопрос всё-таки упирается в то, что SIGTERM не отправляется дочерним процессам. Если я запускаю скрипт прямо нодом из консоли, то он получит SIGTERM. А если через forever, то SIGTERM получает только forever и, поскольку его не обрабатывает, просто дохнет вместе со всеми потомками.
Значит, либо поискать возможность при начале перезагрузки выполнить forever.stopAll. Либо нафиг forever вообще.