Как каждый пишет Новомодную задачу, которая, как гарантируют, будет работать только однажды за каждым запуском, но, как также гарантируют, будет работать к завершению, прежде чем любое по крайней мере из двух других заданий начнет работать. Я не хочу изменять Выскочку init файлы для тех двух других заданий, поскольку они не принадлежат мне. Перезапуск любого из тех двух других заданий не должен вызывать желаемую задачу работать снова.
Ситуация состоит в том, что желаемая задача должна сделать некоторые модификации в некоторые файлы в локальной файловой системе, в которой будут нужны оба из других заданий.
Я абсолютно плохо знаком с Выскочкой и нахождением его более крутая кривая обучения, чем я ожидал, таким образом, образование на том, почему работы решения будут так же ценны как само решение.
Я полагаю, что у меня есть ответ на мой собственный вопрос, который усиливает частичный ответ Mark Russell решения и CameronNemo к связанному, но несколько различному вопросу.
Два Новомодных конфигурационных файла требуются. Первым является задание, которое запускается, как только локальная файловая система доступна, выполняет желаемые модификации файла как сценарий перед запуском, и затем простаивает в состоянии выполнения навсегда:
# modify-files - Single-execution file modification job
start on local-filesystems
console log
pre-start script
echo "$(date --rfc-3339=ns) $(hostname) $UPSTART_JOB"
exec /path/to/your/script
end script
второй конфигурационный файл является Новомодной задачей, которая задерживает запуск всех других заданий, которые могли бы зависеть от файлов, которые мы пытаемся изменить. Это производит один экземпляр себя на зависимое задание:
# modify-files-wait - Helper task for modify-files
start on (starting jobA or jobB)
stop on (started modify-files or stopped modify-files)
instance $JOB
console log
normal exit 0 2
task
script
echo "$(date --rfc-3339=ns) $(hostname) $UPSTART_JOB ($UPSTART_INSTANCE)"
status modify-files | grep -q "start/running" && exit 0
start modify-files || true
sleep infinity
end script
Выскочка уничтожит все экземпляры modify-files-wait
, как только modify-files
бездействует в его состоянии выполнения. То, что normal exit
строка составляет возможность того, чтобы быть уничтоженным во время ее бесконечного сна. Нам нужно task
строка для блокирования jobA и задания, пока остановленное состояние не достигнуто. Какой бы ни экземпляр работает, сначала запустится modify-files
, если он не был уже запущен.
С тех пор modify-files
никогда не достигает его остановленного состояния, это никогда не будет выполняться снова, независимо от jobA или jobB быть перезапущенным.
Это решение, кажется, работает, но я приветствую любые критические замечания или улучшения.
Можно определить простое задание задачи, которые запускаются на событии по Вашему выбору, выполняют сценарий, и в конце испускают событие для запуска других двух заданий.
, Например:
# mainJob -
#
# This service emit myEvent to run firstJob
description "emit myEvent to run firstJob"
start on runlevel [2345]
task
console log
script
echo "(startTask) $UPSTART_JOB -- $UPSTART_EVENTS"
exec /path/to/your/script
initctl emit -n myEvent
end script
, Чтобы не сделать, изменяют новомодный сценарий других двух заданий, Вы должны файлы переопределения , которые позволяют Вам изменять путь, которым запускается задание, и зайдите в изменение запуска на и остановитесь на условиях.
Следование моим примерам я создал простое firstJob.conf
как это:
# firstJob -
#
# This service print environment variable
description "print environment variable"
start on runlevel [2345]
stop on runlevel [016]
task
console log
script
if [ "$RUNLEVEL" = "0" -o "$RUNLEVEL" = "1" -o "$RUNLEVEL" = "6" ]; then
exec echo "(stopTask) $UPSTART_JOB -- $UPSTART_EVENTS"
else
exec echo "(startTask) $UPSTART_JOB -- $UPSTART_EVENTS"
fi
end script
И затем я переопределяю, начинают при условии создавать файл переопределения:
echo "start on myEvent" > /etc/init/firstJob.override
Так firstJob
запустится на myEvent
сгенерированный mainJob
и остановится на runlevel [016]
, я протестировал эти задания на lubuntu 12.04 и после перезагрузки, которую я нашел в /var/log/upstart/firstJob.log
:
(startTask) firstJob -- myEvent
необходимо проверить, нужно ли "для других двух заданий" конкретное условие события запуститься и быть уверенными, что mainJob
запускаются на этих событиях.
start on starting jobA or starting jobB
instance $JOB
pre-start exec /path/to/script
стартовый бит препятствует тому, чтобы задания шли дальше в их жизненном цикле, пока это задание не завершается.
экземпляр укусил, то, так, чтобы и стартовые события (для jobA и jobB) были запрещены, не всего один, как имел бы место, если бы у Вас не было строки файла конфигурации экземпляра.
использование должностного лица/сценария перед запуском (вместо постоянного должностного лица/сценария) состоит в том так, чтобы, когда сценарий / выполняемые концы команды, задание все еще рассмотрят, работая, тогда как с традиционным должностным лицом/сценарием задание считается остановленным, когда должностное лицо/сценарий выходит.
Используя задачу был бы точно, что делает прогон задания дважды (например, если задания, которые Вы имеете, перезапущены), таким образом, мы пропускаем его.