제대로 종료하는 데 몇 분이 걸릴 수 있는 시스템 사용자 서비스가 있습니다. 이는 매우 큰 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 설치에서 이것을 테스트하고 있습니다.