Как написать сервис systemd, который корректно завершает работу после выключения или перезагрузки компьютера? В частности, он должен задерживать выключение машины, пока он не выйдет изящно.
У меня есть служба, которая отключается за 10 секунд: /usr/local/bin/shutdowntest.sh:
#!/bin/bash
SHUTDOWN=0
SHUTDOWN_TIME=10
TRAPPED_SIGNAL=
function onexit() {
TRAPPED_SIGNAL=$1
SHUTDOWN=1
}
for SIGNAL in SIGINT SIGTERM SIGHUP SIGPIPE SIGALRM SIGUSR1 SIGUSR2; do
trap "onexit $SIGNAL" $SIGNAL
done
echo >&2 "shutdowntest running"
while ((!SHUTDOWN || SHUTDOWN_TIME>0)); do
if [[ -n "$TRAPPED_SIGNAL" ]]; then
echo >&2 "shutdowntest received signal $TRAPPED_SIGNAL"
TRAPPED_SIGNAL=
elif ((SHUTDOWN)); then
echo >&2 "shutdowntest Shutting down: $SHUTDOWN_TIME more sleeps"
SHUTDOWN_TIME=$((SHUTDOWN_TIME-1))
sleep 1
else
sleep 10
fi
done
echo >&2 "shutdowntest Finished shutting down; quitting"
Я установил TimeoutStopSec на 15 секунд в /etc/systemd/system/shutdowntest.service:
[Service]
ExecStart=/usr/local/bin/shutdowntest.sh
TimeoutStopSec=15
[Install]
WantedBy=multi-user.target
Когда я запускаю sudo systemctl stop shutdowntest.service
, служба корректно завершает работу в соответствии с /var/log/syslog
:
00:57:11 shutdowntest.sh[1980]: shutdowntest received signal SIGTERM
00:57:11 shutdowntest.sh[1980]: shutdowntest Shutting down: 10 more sleeps
00:57:11 systemd[1]: Stopping shutdowntest.service...
00:57:11 shutdowntest.sh[1980]: Terminated
00:57:11 shutdowntest.sh[1980]: shutdowntest Shutting down: 9 more sleeps
00:57:12 shutdowntest.sh[1980]: shutdowntest Shutting down: 8 more sleeps
00:57:13 shutdowntest.sh[1980]: shutdowntest Shutting down: 7 more sleeps
00:57:14 shutdowntest.sh[1980]: shutdowntest Shutting down: 6 more sleeps
00:57:15 shutdowntest.sh[1980]: shutdowntest Shutting down: 5 more sleeps
00:57:16 shutdowntest.sh[1980]: shutdowntest Shutting down: 4 more sleeps
00:57:17 shutdowntest.sh[1980]: shutdowntest Shutting down: 3 more sleeps
00:57:18 shutdowntest.sh[1980]: shutdowntest Shutting down: 2 more sleeps
00:57:19 shutdowntest.sh[1980]: shutdowntest Shutting down: 1 more sleeps
00:57:20 shutdowntest.sh[1980]: shutdowntest Finished shutting down; quitting
00:57:20 systemd[1]: Stopped shutdowntest.service.
Но когда я sudo reboot
или sudo shutdown now
машина, служба уничтожается без достаточного времени для корректного завершения, и / var / log / syslog завершается только через 1 с.
00:59:30 shutdowntest.sh[2014]: Terminated
00:59:30 shutdowntest.sh[2014]: shutdowntest received signal SIGTERM
00:59:30 shutdowntest.sh[2014]: shutdowntest Shutting down: 10 more sleeps
00:59:30 systemd[1]: Stopping shutdowntest.service...
Как обеспечить, чтобы службе было предоставлено время ( TimeoutSec
или TimeoutStopSec
) для выхода при выключении или перезагрузке машины?
journalctl -u shutdowntest.service
) вместо того, чтобы смотреть прямо в/var/log/syslog
? Мне интересно, не останавливается ли syslog перед вашим обслуживанием, а затем не регистрируется остальная часть выводаОтветы:
Комментарий от двуугольника правильно. Я искал
/var/log/syslog
, но это написаноrsyslog.service
, что systemd останавливается довольно рано в процессе выключения (как указано «Служба журналирования остановленной системы» ниже).После того, как я включил постоянную регистрацию journald вместо (
Storage=persistent
в/etc/systemd/journald.conf
иsystemctl restart systemd-journald
),journalctl -b-1 -u shutdowntest.service
показывает , что моя служба действительно достаточно времени , чтобы закрыть после того, как системыreboot
эд,shutdown
или после нажатия на кнопку питания нажата (ACPI G2 Soft Off).источник