รอให้บริการออกจากระบบก่อนที่จะปิดเครื่อง / รีบูต


9

คุณจะเขียนบริการ 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 เป็น 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 สิ้นสุดเพียง 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) เพื่อออกเมื่อเครื่องหยุดทำงานหรือเริ่มระบบใหม่


1
systemd ควรรอให้บริการหยุดทำงานแล้ว คุณสามารถตรวจสอบในวารสาร ( journalctl -u shutdowntest.service) แทนที่จะมองโดยตรงได้/var/log/syslogหรือไม่? ฉันสงสัยว่า syslog ไม่หยุดก่อนที่จะให้บริการของคุณแล้วไม่บันทึกส่วนที่เหลือของการส่งออก
Bigon

คำตอบ:


4

ความคิดเห็นจาก Bigonถูกต้อง ฉันกำลังดูอยู่/var/log/syslogแต่สิ่งนี้เขียนโดยrsyslog.servicesystemd หยุดก่อนกระบวนการปิดเครื่องค่อนข้างเร็ว (ตามที่ระบุโดย“ Stopped System Logging Service” ด้านล่าง)

หลังจากที่ฉันเปิดใช้งานการบันทึกเจอร์นัลแบบถาวรแทน ( Storage=persistentใน/etc/systemd/journald.confและsystemctl restart systemd-journald) journalctl -b-1 -u shutdowntest.serviceแสดงว่าบริการของฉันได้รับเวลาเพียงพอที่จะปิดหลังจากระบบrebooted shutdownหรือหลังจากกดปุ่มเปิดปิด (ACPI G2 Soft Off)

journalctl -b-1 -u shutdowntest.service -u rsyslog.service -u systemd-logind
-- Logs begin at Mon 2018-03-26 18:39:12 UTC, end at Mon 2018-03-26 20:22:34 UTC. --
…
Mar 26 18:46:46 myhost systemd-logind[1202]: Power key pressed.
Mar 26 18:46:46 myhost systemd-logind[1202]: Powering Off...
Mar 26 18:46:46 myhost systemd-logind[1202]: System is powering down.
Mar 26 18:46:46 myhost shutdowntest.sh[1237]: Terminated
Mar 26 18:46:46 myhost shutdowntest.sh[1237]: shutdowntest received signal SIGTERM
Mar 26 18:46:46 myhost shutdowntest.sh[1237]: shutdowntest Shutting down: 10 more sleeps
Mar 26 18:46:46 myhost systemd[1]: Stopping shutdowntest.service...
Mar 26 18:46:46 myhost systemd[1]: Stopping Login Service...
Mar 26 18:46:46 myhost systemd[1]: Stopped Login Service.
Mar 26 18:46:46 myhost systemd[1]: Stopping System Logging Service...
Mar 26 18:46:47 myhost systemd[1]: Stopped System Logging Service.
Mar 26 18:46:47 myhost shutdowntest.sh[1237]: shutdowntest Shutting down: 9 more sleeps
Mar 26 18:46:48 myhost shutdowntest.sh[1237]: shutdowntest Shutting down: 8 more sleeps
Mar 26 18:46:49 myhost shutdowntest.sh[1237]: shutdowntest Shutting down: 7 more sleeps
Mar 26 18:46:50 myhost shutdowntest.sh[1237]: shutdowntest Shutting down: 6 more sleeps
Mar 26 18:46:51 myhost shutdowntest.sh[1237]: shutdowntest Shutting down: 5 more sleeps
Mar 26 18:46:52 myhost shutdowntest.sh[1237]: shutdowntest Shutting down: 4 more sleeps
Mar 26 18:46:53 myhost shutdowntest.sh[1237]: shutdowntest Shutting down: 3 more sleeps
Mar 26 18:46:54 myhost shutdowntest.sh[1237]: shutdowntest Shutting down: 2 more sleeps
Mar 26 18:46:55 myhost shutdowntest.sh[1237]: shutdowntest Shutting down: 1 more sleeps
Mar 26 18:46:56 myhost shutdowntest.sh[1237]: shutdowntest Finished shutting down; quitting
Mar 26 18:46:56 myhost systemd[1]: Stopped shutdowntest.service.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.