シャットダウンタイムアウトはTimeoutStopUSecをサポートしません。

シャットダウンタイムアウトはTimeoutStopUSecをサポートしません。

正しくシャットダウンするのに数分かかることがあるシステムユーザーサービスがあります。これは非常に大きなHDF5データベース(サイズ数GB)なので、プロセスが完全に停止しないと、その後データベースが破損します。

ここでこのようなスレッドをたくさん見つけました。 システムサービスのタイムアウト値を変更するには? しかし、残念ながら彼らは私に全く役に立たず、時間制限を増やすことはできませんでした。

タイムアウトで問題が発生したため、次の例を作成しました。

#!/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

ただし、rebootrootとして実行するとコンソールに表示されます。

[***] 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のインストールでこれをテストしています。

ベストアンサー1

おすすめ記事