У меня ситуация, когда сервер RHEL 6.4 отправляет TERM
и KILL
сигнализирует слишком быстро, прежде чем приложения и базы данных успеют корректно остановиться. Похоже, что Upstart преждевременно передает управление скриптам sysv-rc.
Чтобы решить эту проблему, я попытался добавить sleep
и logger
команды в конфигурацию Upstart. В pre-script
строфа записывает в системный журнал, но спящий режим никогда не завершается, потому что система перезагружается в течение 10 секунд. Я также добавил kill timeout
который игнорируется.
# cleanup at system shutdown
# Does stop all on apps, stops monit instances, then does a clean.
start on runlevel [016]
console output
kill timeout 120
task
pre-start script
logger -s -t "arcsight-services-stopall" "Running pre-start..."
/etc/init.d/arcsight_services stop
sleep 60
end script
script
logger -s -t "arcsight-services-stopall" "Running script..."
/etc/init.d/arcsight_services shutdown monit
/etc/init.d/arcsight_services clean all
end script
Я знаю, что Upstart должен был распараллелить процесс загрузки / остановки, но он только парализовал мои попытки отладки.
В RHEL 6 каков окончательный порядок скриптов, которые выполняются после выдачи: shutdown -r now
?
shutdown -r now
?????
/etc/init/rc.conf
(Выскочка)/etc/rc.d/rc
(sysv-rc)?????
/etc/rc3.d/K*
(sysv-rc)/etc/rc6.d/S*
(sysv-rc)?????
Где вызываются другие скрипты /etc/init/*.conf?
ОБНОВЛЕНИЕ: при вскрытии /etc/rc.d/rc
, Я обнаружил, что если я touch /var/run/confirm
, процесс переходит в интерактивный режим, а затем мои команды сна и журнала, похоже, выполняются. Это сбивает меня с толку, потому что я думал, что в этот момент Upstart передал управление sysv-rc.
Хотя в этом ответе не рассматривается порядок выполнения скриптов во время завершения работы RHEL 6, он решает проблему системного завершения процессов до того, как они будут корректно остановлены.
/etc/init/arcsight-services-stopall.conf:
# cleanup at system shutdown
# Does stop all on apps, stops monit instances, then does a clean.
start on starting rc RUNLEVEL=[016]
task
kill timeout 330
pre-start script
logger -s -t "ArcSight" "ArcSight ESM shutdown initiated..."
/etc/init.d/arcsight_services shutdown all
/etc/init.d/arcsight_services shutdown monit
/etc/init.d/arcsight_services clean all
sleep 300
end script
script
logger -s -t "ArcSight" "ArcSight ESM shutdown complete."
end script
Ключ менял start on starting rc RUNLEVEL=[016]
. Запуская этот скрипт, пока /etc/init/rc.conf
только запускается, блокируется на 5 минут перед выполнением скриптов sysv-rc. Надеюсь, что в течение этих 5 минут все базы данных и приложения ArcSight будут корректно остановлены. Тестирование показало, что все было остановлено в течение 3 минут, поэтому 5 минут должны быть безопасной задержкой.
Всегда приятно видеть, что продукт стоимостью в несколько миллионов долларов требует взлома покупателя.