То, как я создаю Новомодное задание единственного выполнения, гарантировало, что завершилось, прежде чем два других задания начинаются?

Как каждый пишет Новомодную задачу, которая, как гарантируют, будет работать только однажды за каждым запуском, но, как также гарантируют, будет работать к завершению, прежде чем любое по крайней мере из двух других заданий начнет работать. Я не хочу изменять Выскочку init файлы для тех двух других заданий, поскольку они не принадлежат мне. Перезапуск любого из тех двух других заданий не должен вызывать желаемую задачу работать снова.

Ситуация состоит в том, что желаемая задача должна сделать некоторые модификации в некоторые файлы в локальной файловой системе, в которой будут нужны оба из других заданий.

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

5
задан 10 October 2014 в 12:34

3 ответа

Я полагаю, что у меня есть ответ на мой собственный вопрос, который усиливает частичный ответ 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 быть перезапущенным.

Это решение, кажется, работает, но я приветствую любые критические замечания или улучшения.

3
ответ дан 17 November 2019 в 11:24

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

, Например:

# 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 запускаются на этих событиях.

2
ответ дан 17 November 2019 в 11:24
start on starting jobA or starting jobB

instance $JOB

pre-start exec /path/to/script

стартовый бит препятствует тому, чтобы задания шли дальше в их жизненном цикле, пока это задание не завершается.

экземпляр укусил, то, так, чтобы и стартовые события (для jobA и jobB) были запрещены, не всего один, как имел бы место, если бы у Вас не было строки файла конфигурации экземпляра.

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

Используя задачу был бы точно, что делает прогон задания дважды (например, если задания, которые Вы имеете, перезапущены), таким образом, мы пропускаем его.

1
ответ дан 17 November 2019 в 11:24

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

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