Как принудительно остановить бесконечный цикл в Upstart «pre-start script»?

271
Thorsten Schöning

У меня есть следующее pre-start scriptв одной из моих конфигураций Upstart:

pre-start script cd "$(dirname "$(dirname "$(readlink "/etc/init/$.conf")")")"  . "lib/upstart/waitFor[...].sh" end script 

Вызываемая функция, по сути, представляет собой только бесконечный цикл, ожидающий, пока какой-то ресурс станет доступным, для которого в настоящее время не существует конфигурации Upstart:

function waitFor[...]() { while [ true ] do if [...] > /dev/null then break fi  sleep 10s done }  waitFor[...] 

Вчера я обнаружил проблему с этим подходом, если ожидаемый ресурс по какой-то причине не становится доступным: задание навсегда зависает start/pre-start, что ожидается, но если я выдаю stopсобытие, pre-start scriptоно не уничтожается или тому подобное, что я ошибочно предположил, но вместо этого состояние работы меняется на stop/pre-start. Проблема в том, что оболочка, в которой я выпустил stopсобытие, теперь висит навсегда, скорее всего, ожидая pre-start scriptзавершения. Если я нажму CTRL + C на этой оболочке и выдам stopснова, Upstart сообщит мне, что задание уже остановлено и быстро возвращается, но pre-start scriptоно все еще выполняется, что легко увидеть, используя statusвывод, который stop/pre-startснова выводится .

Итак, мне нужен какой-то способ заставить Upstart уничтожить сам скрипт или каким-то образом в скрипте распознать, что он должен перестать ждать сам.

Я не нахожу никаких forceаргументов или что-то подобное только для Upstart --no-wait. Но это не останавливает сценарий ожидания, только больше не блокирует оболочку остановки. Так есть ли какое-то изменение состояния, которое скрипт может легко распознать? Единственное, о чем я могу думать в настоящее время, это запрос статуса работы.

Есть еще идеи? Я думаю, что предпочел бы какой-то аргумент командной строки для остановки, которую я мог пропустить.

0

0 ответов на вопрос

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