Последовательный хук перед входом на уровень запуска?

У меня очень специфическая проблема, и я боролся с Upstart всю ночь безуспешно.

В моем конкретном случае у меня есть сервер с кучей клиентов, загруженных по протоколу PXE. Данные для клиентов хранятся в MySQL. Когда я выключаю сервер, прежде чем что-то случится, мне нужно также отключить все клиенты PXE. В старом последовательном мире sysvinit это было очень просто: просто включите сценарий удаленного отключения в начале последовательности, прежде чем сеть, portmap, nfs, mysql прекратят работу. Это было нормально, даже если бы всем клиентам потребовалось 10 минут (но обычно 30 секунд было бы достаточно).

С выскочкой я не могу на всю жизнь заставить клиентов завершить работу перед сервером. Мне удалось запустить скрипт до того, как mysql вышел из строя, но этого недостаточно, так как кажется, что сеть и / или другие вспомогательные средства, которые действительно нужны PXE-клиентам, выходят из строя, поэтому они монтируют NFS в дыму, и они никогда не выключайте Тем не менее, они отключатся, как только сервер снова включится.

Самое близкое, что я получил к получению, это то, что я хочу:

kill timeout 70

start on runlevel [016] and (stopping mysql or stopping portmap or stopping idmapd or stopping statd)

task

exec the-script-that-shuts-clients-down.sh

Сценарий говорит всем машинам выключаться, затем следит за ними (посылая пинги раз в секунду), и только когда либо они все выключены, либо сценарий становится скучным и сдается, если сервер продолжает последовательность выключений.

Теперь, с Upstart, мой сценарий убивается примерно через 7 секунд. Даже с тайм-аутом в 70 секунд, как указано выше.

В идеале, я хотел бы выполнить этот сценарий до того, как что-нибудь еще будет вызвано переключателем уровня запуска, но Google говорит, что мне не повезло с этим. В Upstart НЕТ ПОСЛЕДОВАТЕЛЬНОГО механизма - даже «обратная совместимость» rc выполняется параллельно с остальными сервисами upstart.

Есть идеи по этому поводу? Я использую Ubuntu 10.10.

1
задан 16 September 2011 в 10:58

1 ответ

Мне удалось решить мою проблему следующим образом:

kill timeout 70

start on runlevel RUNLEVEL=[016] PREVLEVEL=[2345] and (starting rc RUNLEVEL=[016] or stopping mysql or stopping portmap or stopping idmapd or stopping statd)

task

exec the-script-that-shuts-clients-down.sh

Ну, почти, потому что похоже, что в Upstart есть небольшая ошибка, специфичная для перехвата rc. По крайней мере, в Ubuntu 10.10 это так. У меня нет 11.04 под рукой, чтобы подтвердить это.

Работа вокруг сейчас выглядит следующим образом:

В the-script-that-shuts-clients-down.sh , перед выходом я делаю

touch /etc/init/my-job.conf
[ 117], где my-job.conf содержит материал выше. До сих пор он откреплял rc от запуска / запуска каждый раз.

Еще одна загвоздка в том, что если я напишу , начиная с rc , а не , начиная с rc RUNLEVEL = [016] , тогда upstart тоже зависнет при загрузке rc (и та же команда прикосновения снимает его ).

0
ответ дан 16 September 2011 в 10:58

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

Похожие вопросы: