핵심요약: 특정 민감한 프로세스가 작업을 완료할 때까지 요청된 재시작을 연기하는 메커니즘을 구축하려고 합니다.
systemd에는 reboot.target
기본값 JobTimeoutSec=30min
및 가 있습니다 JobTimeoutAction=force-reboot
.
ExecStop
중단 없이 완료할 수 있어야 하는 작업이 있습니다 . 따라서 서비스에는 TimeoutStopSec=infinity
; 이 중지 작업이 on 의 디스패치를 차단하는 경우 reboot.target
중지 작업이 계속 실행 중이더라도 결국 강제로 다시 시작됩니다 JobTimeout
.reboot.target
reboot.target
이 문제를 해결하려는 현재 시도는 기본값을 JobTimeoutAction=force-reboot
로 대체하고 다음과 같은 이벤트를 JobTimeoutAction=exit
추가 하는 오버레이를 구축하는 것입니다 .OnFailure
# /etc/systemd/system/reboot.target.d/defer-if-critical-job-running.conf
[Unit]
JobTimeoutAction=exit
FailureActionExitStatus=1
OnFailure=reboot-now-unless-critical-job-is-running.service
# /etc/systemd/system/reboot-now-unless-critical-job-is-running.service
[Unit]
Description=Reboot unless a critical job is running
DefaultDependencies=no
[Service]
ExecStart=/bin/sh -c 'if systemctl is-active some-critical-job.service; then systemctl reboot; else systemctl reboot --force; fi'
그러나 이것은 실제로 작동하지 않습니다. JobTimeout
on에 도달하면 즉시 강제로 다시 시작됩니다.reboot.target
재시작을 무기한 연기하려면 어떻게 해야 합니까?오직특정 중요한 작업이 실행 중일 때?