Makineyi kapattıktan veya yeniden başlattıktan sonra zarif bir şekilde kapatılan bir sistem hizmetini nasıl yazıyorsunuz? Özellikle, düzgün bir şekilde çıkıncaya kadar makinenin kapanmasını geciktirmelidir.
Kapatmak için 10 saniye süren bir hizmetim var: /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"
/Etc/systemd/system/shutdowntest.service içinde TimeoutStopSec öğesini 15 sn olarak ayarladım:
[Service]
ExecStart=/usr/local/bin/shutdowntest.sh
TimeoutStopSec=15
[Install]
WantedBy=multi-user.target
Ben çalıştırdığınızda sudo systemctl stop shutdowntest.service
, hizmet incelikle kapanır /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.
Ancak ben sudo reboot
veya sudo shutdown now
makine, hizmet zarif bir şekilde çıkmak için yeterli zaman olmadan öldürülür ve / var / log / syslog yalnızca 1 saniye sonra sona erer.
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...
Servisin, makine kapatıldığında veya yeniden başlatıldığında çıkış zamanı ( TimeoutSec
veya TimeoutStopSec
) verildiğinden nasıl emin olunur?
journalctl -u shutdowntest.service
Doğrudan bakmak yerine dergiye ( ) göz atabilir misiniz/var/log/syslog
? Syslog'un hizmetinizden önce durdurulup durdurulmadığını ve daha sonra çıktının geri kalanını günlüğe kaydetmediğini merak ediyorum