У меня есть следующий pre-start script
в одной из моих конфигураций Upstart:
pre-start script
cd "$(dirname "$(dirname "$(readlink "/etc/init/${UPSTART_JOB}.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
. Но это не останавливает сценарий ожидания, только больше не блокирует оболочку остановки. Так есть ли какое-то изменение состояния, которое скрипт может легко распознать? Единственное, о чем я могу думать в настоящее время, это запрос статуса работы.
Есть еще идеи? Я думаю, что предпочел бы какой-то аргумент командной строки для остановки, которую я мог пропустить.