正しくシャットダウンするのに数分かかることがあるシステムユーザーサービスがあります。これは非常に大きな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
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のインストールでこれをテストしています。