आप एक प्रणालीगत सेवा कैसे लिखते हैं जो मशीन शटडाउन या रिबूट पर शान से बंद हो जाती है? विशेष रूप से, यह मशीन शटडाउन में देरी करना चाहिए जब तक कि यह इनायत से बाहर नहीं निकलता है।
मेरे पास एक सेवा है जिसे बंद करने में 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"
मैंने TimeetStopSec को 15s में /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 केवल 1s बाद में समाप्त होता है।
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 बंद नहीं हुआ है और फिर बाकी आउटपुट लॉग नहीं कर रहा है