Comment écrivez-vous un service systemd qui s'arrête normalement lors de l'arrêt ou du redémarrage de la machine? En particulier, il doit retarder l'arrêt de la machine jusqu'à ce qu'il se termine correctement.
J'ai un service qui prend 10 secondes pour s'éteindre: /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"
J'ai défini TimeoutStopSec sur 15s dans /etc/systemd/system/shutdowntest.service:
[Service]
ExecStart=/usr/local/bin/shutdowntest.sh
TimeoutStopSec=15
[Install]
WantedBy=multi-user.target
Lorsque je cours sudo systemctl stop shutdowntest.service
, le service s'arrête gracieusement en fonction de /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.
Mais lorsque moi sudo reboot
ou sudo shutdown now
la machine, le service est tué sans assez de temps pour se terminer correctement, et / var / log / syslog se termine seulement 1 seconde plus tard.
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...
Comment s'assurer que le service dispose du temps ( TimeoutSec
ou TimeoutStopSec
) de se terminer lorsque la machine est arrêtée ou redémarrée?
journalctl -u shutdowntest.service
) au lieu de regarder directement dans/var/log/syslog
? Je me demande si syslog n'est pas arrêté avant votre service et ensuite ne pas enregistrer le reste de la sortieRéponses:
Le commentaire de Bigon est correct. Je cherchais
/var/log/syslog
, mais ceci est écrit parrsyslog.service
, qui systemd s'arrête assez tôt dans le processus d'arrêt (comme indiqué par «Service de journalisation du système arrêté» ci-dessous).Après avoir activé la journalisation journalière persistante à la place (
Storage=persistent
dans/etc/systemd/journald.conf
etsystemctl restart systemd-journald
), celajournalctl -b-1 -u shutdowntest.service
montre que mon service dispose en effet de suffisamment de temps pour s'arrêter après que le système estreboot
éditéshutdown
, ou après avoir appuyé sur la touche Marche / Arrêt (ACPI G2 Soft Off).la source