У меня есть следующий 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 . Но это не останавливает сценарий ожидания, только больше не блокирует оболочку остановки. Так есть ли какое-то изменение состояния, которое скрипт может легко распознать? Единственное, о чем я могу думать в настоящее время, это запрос статуса работы.

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

0