Я пытаюсь найти способ получить одно задание, которое запускается, когда другая работа останавливается, и не допустить, чтобы эта другая работа действительно прекратилась.
По сути, у меня есть служба, которая работает, позволяет притворяться apache, и я хочу создать еще одно задание upstart, которое будет препятствовать закрытию этой службы, если не будут выполнены определенные условия. Поэтому я создал задание «задача», чтобы выполнить несколько проверок, и затем, если эти проверки не пройдут, Apache не должен закрываться.
Я думал, что мог бы сделать что-то вроде следующего:
start on stopping apache
task
script
if some_condition; then
start --no-wait apache
fi
end script
Но другой сервис по-прежнему отключается, он просто немедленно запускается обратно. Я не могу этого иметь, он вообще не должен закрываться.
Я поместил оператор sleep
в приведенный выше скрипт, и он задерживает остановку службы. Поэтому, если служба все еще работает, я думаю, что я смогу предотвратить ее отключение.
Таким образом, после копания в исходном коде upstart единственный раз, когда скрипт upstart может прервать операцию, находится в фазе «pre» (pre-start / pre-stop). Когда вы используете триггер, такой как start on stopping foo
, сервис получает событие после фазы pre-stop
для 'foo', поэтому вы не можете запустить его обратно без его остановки.
Однако при наличии условия start on stopping foo
служба 'foo' не остановится, пока служба, прослушивающая событие, не завершится. Так что я в конечном итоге просто зацикливаюсь до тех пор, пока условие, которое я проверяю, не будет выполнено. Это не самое лучшее решение, но оно работает.
Альтернативным решением также было бы создать файл .override
для службы и поместить скрипт pre-stop
в переопределение. Затем условие может быть проверено в pre-stop
, и выдача start
не даст службе остановиться.
К сожалению, это не совсем работает для меня из-за других сложных причин, но это может быть вариант для тех, кто пытается это сделать.