我有一个 systemd 用户服务,可能需要很多分钟才能正确关闭。这是一个非常大的 HDF5 数据库(几 GB 大),如果进程没有完全停止,那么数据库随后就会损坏。
我在这里找到了很多像这样的线程 如何更改systemd服务超时值? 但遗憾的是他们根本没有帮助我,我无法增加超时。
因为我在超时方面遇到了一些麻烦,所以我写了这个例子:
#!/bin/bash
RUNNING=true
VAR_RUN=${HOME}/.run
PIDFILE=${VAR_RUN}/mondas_ctrl_launcher.pid
LOG_DIR=${HOME}/logs
LOG_FILE=${LOG_DIR}/mondas_ctrl_launcher.log
MONDAS_BASE=${HOME}/src/mondas
on_sigint()
{
RUNNING=false
}
log()
{
now=$(date)
message="${now}: ${@}"
echo ${message}
echo ${message} >> "${LOG_FILE}"
}
# taken from
# https://blog.dhampir.no/content/sleeping-without-a-subprocess-in-bash-and-how-to-sleep-forever
# Execute this with BASH as it uses bash extensions
snore()
{
local IFS
[[ -n "${_snore_fd:-}" ]] || { exec {_snore_fd}<> <(:); } 2>/dev/null ||
{
# workaround for MacOS and similar systems
local fifo
fifo=$(mktemp -u)
mkfifo -m 700 "$fifo"
exec {_snore_fd}<>"$fifo"
rm "$fifo"
}
read ${1:+-t "$1"} -u $_snore_fd || :
}
_mondas_ctrl()
{
# my true program that starts a lot of
# processes in a tmux session
# mondas_ctrl "${@}" >> "${LOG_FILE}" 2>&1
# doing just "true" for testing purposes
true
}
mkdir -p "${VAR_RUN}"
mkdir -p "${LOG_DIR}"
case "${1}" in
start)
log "Starting mondas PWD: $(pwd)"
_mondas_ctrl start
log "mondas_ctrl start executed"
echo "${$}" > ${PIDFILE}
# SIGINT
trap on_sigint 2
while ${RUNNING} ; do
snore 1
done
log "Exiting sleep loop"
;;
stop)
log "Stopping mondas"
_mondas_ctrl stop
# simulating long shutdown
snore 275
log "mondas_ctrl stop executed"
if test -f "${PIDFILE}" ; then
kill -2 $(cat "${PIDFILE}")
rm -rf "${PIDFILE}"
fi
;;
*)
echo "usage: $0 start|stop" >&2
exit 1
;;
esac
和我的systemd
用户服务:
[Unit]
Description=Mondas
Wants=network.target
After=network.target
[Service]
Type=simple
RemainAfterExit=no
ExecStart=%h/bin/mondas_ctrl_launcher start
ExecStop =%h/bin/mondas_ctrl_launcher stop
TimeoutStartSec=120
TimeoutStopSec=500
Restart=always
RestartSec=1
[Install]
WantedBy=default.target
所以我启用并启动它并检查守护进程的超时设置
$ systemctl --user enable mondas2.service
$ systemctl --user start mondas2.service
$ systemctl --user show mondas2.service -p TimeoutStopUSec
TimeoutStopUSec=8min 20s
但是,如果我reboot
以 root 身份执行,在控制台上我可以看到
[***] A stop job is running for User Manager for UID 1000 (20s / 2min)
90 秒后,然后systemd
终止进程,日志文件mondas_ctrl_launcher.log
丢失"mondas_ctrl stop executed"
日志条目。
我什至改变/etc/systemd/system.conf
并设置
DefaultTimeoutStartSec=300s
DefaultTimeoutStopSec=300s
但当我执行时,reboot
控制台仍然显示最大值。超时 2 分钟,90 秒后进程就被终止。无论我做什么,我都无法改变这种行为。
我究竟做错了什么?或者我只是解释了“只是错误”的含义TimeoutStopSec
?或者TimeoutStopSec
,服务文件中的值是否不会影响执行 或 时的实际超时reboot
,并且
poweroff
仅在通过 手动停止服务时影响systemctl --user stop
?如果是这样,如何增加重新启动/关机超时?
我正在当前的 Debian 10.5 安装上对此进行测试。