Домены от REG.RU

Как выполнить команды, при завершении работы Linux

Оригинал: 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

Это хорошее предположение, но оказывается, что это неправильно. 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, Ваша команда будет запускаться при выключение системы.

systemd

Все это замечательно, но что, если вы используете 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

Автор: Сергей Степанов

Поделиться @

Пока нет коментариев. Будьте первым!