시스템 종료 시간 제한은 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

그러나 reboot루트로 실행하면 콘솔에서 볼 수 있습니다.

[***] 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? 그렇다면 재시작/종료 시간 초과를 어떻게 늘릴 수 있습니까?

현재 데비안 10.5 설치에서 이것을 테스트하고 있습니다.

관련 정보