Итак, я работаю над скриптом инициализации выскочки для mysql. Должно быть тривиально, правда? Моя строфа остановки выглядит так:
kill timeout 30
stop on runlevel [016]
я shutdown now -r
, и mysql кричит о том, что мои таблицы MyISAM разбились, как будто я kill -9
Мой процесс mysql. Бу. Upstart, похоже, не ждет завершения работы mysql перед перезапуском. Некоторые поисковые запросы в Google находят меня эта ссылка предлагая вместо этого:
stop on starting rc RUNLEVEL=[016]
и действительно, похоже, это решает проблему.
Но: WFT? По сути, я хочу убедиться, что mysql остановлен, прежде чем пытаться размонтировать локальные файловые системы. Это правильный способ сделать это? Почему мой stop on runlevel
строфа не ждет остановки mysql перед переключением уровней выполнения?
И: это где-нибудь задокументировано?
Проблема, которую он на самом деле вызвана гибкостью Upstarts в обработке как заданий Upstart, так и сервисов SystemV в Ubuntu.
Информацию о событиях можно найти в справочных страницах вашей системы. Если вы используете Ubuntu Natty или новее, теперь у вас будут upstart-events (7):
man 7 upstart-events
Это дает вам много информации. Вот онлайн-версия (большей части) этой справочной страницы:
http://upstart.ubuntu.com/cookbook/#ubuntu-well-known-events-ubuntu-specific
В настоящее время завершение работы системы Ubuntu фактически завершается частью работы SysV (по историческим причинам). Если ты 'stop on runlevel [016]
', ваша работа будет Начало остановиться, когда это runlevel
событие испускается. Однако, если это займет слишком много времени, SystemV часть системы (/etc/init.d/*
) фактически возьмет на себя управление и выключит систему. А если выstop on starting rc RUNLEVEL=[016]
', Выскочка (не SystemV) выполнит вашу работу и как только mysql остановился, затем продолжите запуск последовательности завершения работы SystemV.
Поваренная книга Upstart содержит множество таких примеров: