Làm thế nào để bạn viết một dịch vụ systemd tắt duyên dáng khi tắt máy hoặc khởi động lại? Đặc biệt, nó nên trì hoãn tắt máy cho đến khi thoát ra một cách duyên dáng.
Tôi có một dịch vụ mất 10 giây để tắt: /usr/local/bin/shutdftimeest.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"
Tôi đặt TimeoutStopSec thành 15 giây trong /etc/systemd/system/shutdftimeest.service:
[Service]
ExecStart=/usr/local/bin/shutdowntest.sh
TimeoutStopSec=15
[Install]
WantedBy=multi-user.target
Khi tôi chạy sudo systemctl stop shutdowntest.service
, dịch vụ tắt một cách duyên dáng theo /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.
Nhưng khi tôi sudo reboot
hoặc sudo shutdown now
máy, dịch vụ bị giết mà không có đủ thời gian để thoát một cách duyên dáng và / var / log / syslog chỉ kết thúc sau 1 giây.
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...
Làm thế nào để đảm bảo rằng dịch vụ được cung cấp thời gian ( TimeoutSec
hoặc TimeoutStopSec
) để thoát khi máy bị tắt hoặc khởi động lại?
journalctl -u shutdowntest.service
) thay vì nhìn trực tiếp vào/var/log/syslog
không? Tôi tự hỏi nếu syslog không bị dừng trước dịch vụ của bạn và sau đó không đăng nhập phần còn lại của đầu ra