У меня ситуация, когда сервер RHEL 6.4 отправляет TERM
сигналы KILL
слишком быстро, прежде чем приложения и базы данных успевают изящно остановиться. Похоже, что Upstart преждевременно передает управление скриптам sysv-rc.
Чтобы устранить эту неполадку, я попробовал добавить команды sleep
и logger
в конфигурацию Upstart. pre-script
Строфа пишет в syslog, но сон никогда не завершается, потому что система перезагружается в течение 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
, процесс переходит в интерактивный режим, а затем мои команды sleep и logger, похоже, выполняются. Это сбивает меня с толку, потому что я думал, что в этот момент Upstart передал управление sysv-rc.
решение1
Хотя этот ответ не затрагивает порядок сценариев, которые выполняются во время завершения работы 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 минут должны быть безопасной задержкой.
Всегда приятно видеть, как продукт стоимостью в несколько миллионов долларов требует вмешательства со стороны клиента.