Systemd 关闭超时不支持 TimeoutStopUSec

Systemd 关闭超时不支持 TimeoutStopUSec

我有一个 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 安装上对此进行测试。

相关内容