Оригинал: https://opensource.com/life/16/11/running-commands-shutdown-linux
В Linux и Unix уже давно сделано довольно легкое выполнение команд при загрузке системы. Просто добавив команду в /etc/rc.local
и она будет запускаться. Но, как выясняется, запустить команду при выключение немного сложнее.
Для чего может понадобиться выполнение команд во время выключения компьютера? Возможно, вы хотите отменить регистрацию машины или сервиса из базы данных. Может быть, вы хотите скопировать данные из энергонезависимой памяти на диск. Хотите, чтобы ваш компьютер отправлял "#RIP me!" в Twitter, прежде чем он выключится?
Я должен уточнить что в этот момент, в отличие от остановки демона, я говорю о так называемых командах "в один выстрел" ("one-shot"). Заманчиво думать о них так же, хотя... Если вы знакомы с SysVinit вы можете подумать: "О, я просто создам скрипт для остановки процесса!". Например, /etc/rc.d/rc3.d/K99runmycommandatshutdown
который вызывается, когда ваша система переходит на 3-й уровень выполнения (runlevel 3). В конце концов, это так же как и сценарии остановки в /etc/init.d/
.
Это хорошее предположение, но оказывается, что это неправильно. SysVinit не вслепую запускает скрипты завершения. Вместо этого он ищет (в Red Hat 6) /var/lock/subsys/service_name
(где service_name
, это runmycommandatshutdown
). Таким образом, получается немного сложнее и делает ваш сценарий обычным сервисом. Ниже приведён сценарий для примера:
#!/bin/sh # chkconfig: 2345 20 80 # description: An example init script to run a command at shutdown # runmycommandatshutdown runs a command at shutdown. Very creative. LOCKFILE=/var/lock/subsys/ start(){ # Touch our lock file so that stopping will work correctly touch ${LOCKFILE} } stop(){ # Remove our lock file rm ${LOCKFILE} # Run that command that we wanted to run mycommand } case "$1" in start) start;; stop) stop;; *) echo $"Usage: $0 {start|stop}" exit 1 esac exit 0
После добавления этого скрипта в /etc/init.d/runmycommandatshutdown
и включения его с помощью chkconfig on runmycommandatshutdown
, Ваша команда будет запускаться при выключение системы.
Все это замечательно, но что, если вы используете Linux, которое использует Systemd вместо SysVinit? Оказывается, будет намного проще это сделать с Systemd. Всё что вам нужно сделать, это поместить ваш скрипт в /usr/lib/systemd/system-shutdown/
, который обрабатывается systemd-halt.service. Конечно, если вам нужно управлять зависимостями в определенном порядке (например, вы не можете писать твиты, если сетевой стек уже отключен), то вы можете написать для Systemd файл с сервисным модулем (service unit file). Например:
[Unit] Description=Run mycommand at shutdown Requires=network.target DefaultDependencies=no Before=shutdown.target reboot.target [Service] Type=oneshot RemainAfterExit=true ExecStart=/bin/true ExecStop=mycommand [Install] WantedBy=multi-user.target
Автор: Сергей Степанов
Поделиться @