나는 일주일에 한 번 느리고 버그가 있는 일회성 프로그램을 실행하는 서비스를 가지고 있는데, 때때로 뚜렷한 이유 없이 중단될 수 있습니다. 서비스가 4시간 이상 실행 중이면 서비스를 다시 시작하고 싶습니다. 4시간 후에 다시 시작하도록 설정해 보았습니다(다음 단위 정의로 계속 실행 중인 경우).
[Unit]
Description=Some buggy software
[Service]
WorkingDirectory=/home/buggy
ExecStart=/home/buggy/run
Environment=NODE_VERSION=14
Restart=on-failure
RestartSec=4 h
StartLimitBurst=4
StartLimitInterval=1 s
타이머도 있습니다:
[Unit]
Description=Some buggy software schedule timer
[Timer]
Unit=buggy.service
OnCalendar=Sat *-*-* 22:00:00
[Install]
WantedBy=timers.target
하지만 여전히 무기한 정지 상태입니다. 이틀 동안 실행한 후 서비스를 확인했는데 여전히 정지 상태입니다.
내가 뭘 잘못했나요? systemd를 사용하여 필요한 작업을 수행할 수 있는 방법이 있나요?
답변1
RuntimeMaxSec 지시문을 사용하십시오. 결함이 있는 프로그램을 수정해야 하기 때문에 Watchdog을 사용할 수 없습니다.
RuntimeMaxSec=
서비스가 실행되는 최대 시간을 구성합니다. 이 기능을 사용하고 지정된 시간보다 오랫동안 서비스가 활성화되면 서비스가 종료되고 오류 상태가 됩니다.
Type=oneshot
서비스는 활성화가 완료되는 즉시 종료되므로 이 설정은 서비스에 영향을 미치지 않습니다 .infinity
런타임 제한을 구성하지 않으려면 통과 (기본값)입니다.
Type=notify
/가 서비스Type=notify-reload
에 의해 전송 되면EXTEND_TIMEOUT_USEC=...
런타임이 연장될 수 있습니다RuntimeMaxSec=
. 이 메시지의 첫 번째 수신은RuntimeMaxSec=
런타임이 초과되기 전에 발생해야 하며, 런타임이 초과되면 서비스 관리자는 서비스가 종료될 때까지 지정된 간격으로 서비스가 반복되는 경우 서비스RuntimeMaxSec=
가 계속 실행되도록 허용합니다. (또는 종료 중 ) . (바라보다 ).EXTEND_TIMEOUT_USEC=...
STOPPING=1
sd_notify(3)