Я должен запускать определенный сценарий всякий раз, когда сервер завершает работу, чтобы гарантировать, что некоторые службы всегда останавливаются, а некоторые другие, но необходимые службы все еще работают.
На практике: я должен запустить сценарий резервного копирования, сделав снимок базы данных MySQL, после того, как веб-сервер на том же хосте будет отключен (чтобы база данных была в согласованном состоянии). Я также должен убедиться, что сеть доступна, поскольку сценарий резервного копирования передает файл на другой хост.
Я попытался создать задачу-выскочку со следующей строфой:
start on (stopped apache2 and stopping mysql and net-device-up IFACE=eth0)
Однако этот скрипт так и не запустился.
Какие строфы мне понадобятся, чтобы скрипт запускался правильно? Или это вообще возможно с выскочкой?
Обновление: протестированная мной ОС - Ubuntu 11.04 (natty)
Важно помнить, что выскочка - это система, управляемая событиями, а не система на основе зависимостей.
Так что использование «и» может быть опасным. Вы просите выскочку подождать, пока все эти события не произойдут, чтобы начать вашу работу.
Так что первый time net-device-up IFACE = eth0 генерируется (во время загрузки, если это сервер, или всякий раз, когда он подключается, если это портативный компьютер и управляется NetworkManager), тогда это будет первое условие. Затем выскочка будет ждать, пока apache2 не будет остановлен. Это никогда не будет сгенерировано, если вы используете системный скрипт apache2, потому что он находится в /etc/init.d и не будет генерировать события запуска / запуска / остановки / остановки.
Вероятно, вам нужно следующее:
start on stopping mysql
task
pre-start script
if service apache2 status ; then
exit 0
fi
exec /my/backup/script
end script
Обратите внимание, что задача важно выше. Он сообщает выскочке, что эта работа не выполняется, пока не завершится основной сценарий. Таким образом, событие остановки mysql будет блокировать это задание, пока оно не будет выполнено. Проверка apache2 может быть неправильной ... так как я не уверен, что вы хотите делать, если apache2 все еще работает, когда mysql останавливается. Фактически, эти два события не координируются и фактически происходят параллельно во время выключения системы, поэтому, если вы хотите, чтобы они были скоординированы, вам, вероятно, понадобится другое задание выскочки, которое остановит / запустит apache2. Этого было бы достаточно
start on started mysql
stop on stopping mysql
pre-start exec /etc/init.d/apache2 start
post-stop exec /etc/init.d/apache2 stop
Вам также необходимо удалить обычные ссылки с помощью update-rc.d -f apache2 remove
. Я бы посоветовал назвать это чем-то вроде apache2-upstart, чтобы это не запутало служебную команду.