Bagaimana Anda menulis layanan systemd yang dengan anggun dimatikan pada saat mesin mati atau reboot? Secara khusus, itu harus menunda pematian alat berat sampai keluar dengan anggun.
Saya memiliki layanan yang membutuhkan 10 detik untuk dimatikan: /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"
Saya menetapkan TimeoutStopSec ke 15s di /etc/systemd/system/shutdowntest.service:
[Service]
ExecStart=/usr/local/bin/shutdowntest.sh
TimeoutStopSec=15
[Install]
WantedBy=multi-user.target
Ketika saya menjalankan sudo systemctl stop shutdowntest.service
, layanan dimatikan dengan anggun sesuai dengan /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.
Tetapi ketika saya sudo reboot
atau sudo shutdown now
mesin, layanan terbunuh tanpa cukup waktu untuk keluar dengan anggun, dan / var / log / syslog berakhir hanya 1 detik kemudian.
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...
Bagaimana memastikan bahwa layanan diberi waktu ( TimeoutSec
atau TimeoutStopSec
) untuk keluar ketika mesin dimatikan atau dinyalakan kembali?
journalctl -u shutdowntest.service
) alih-alih melihat langsung/var/log/syslog
? Saya ingin tahu apakah syslog tidak berhenti sebelum layanan Anda dan kemudian tidak masuk sisa outputJawaban:
The komentar dari Bigon benar. Saya mencari di dalam
/var/log/syslog
, tetapi ini ditulis olehrsyslog.service
, yang systemd berhenti cukup awal dalam proses shutdown (seperti yang ditunjukkan oleh "Stopped System Logging Service" di bawah).Setelah saya mengaktifkan journald logging terus-menerus sebagai gantinya (
Storage=persistent
dalam/etc/systemd/journald.conf
dansystemctl restart systemd-journald
),journalctl -b-1 -u shutdowntest.service
menunjukkan bahwa layanan saya memang diberikan cukup waktu untuk dimatikan setelah sistemreboot
dieditshutdown
,, atau setelah tombol Daya ditekan (ACPI G2 Soft Off).sumber