Systemd는 RestartSec=15s를 무시합니다.

Systemd는 RestartSec=15s를 무시합니다.

나는 이 서비스를 가지고 있습니다:

[Unit]
Description=TimeAgent Recorder
Requires=timeagent.service

[Service]
User=deployer
Group=sudo
WorkingDirectory=/home/deployer/timeagent
Environment=HOME=/home/deployer
Environment=RAILS_ENV=production
Environment=EYE_CLIENT_TIMEOUT=120
Restart=always
RestartSec=15
Nice=1

Type=forking
PIDFile=/home/deployer/.eye/pid
ExecStart=/usr/local/bin/bundle exec eye load recorder.eye
ExecStop=/usr/local/bin/bundle exec eye quit --stop-all -t 600

[Install]
WantedBy=timeagent.service

다시 시작한 후 때때로 시작할 수 없습니다.

$ systemctl status timeagent-recorder
● timeagent-recorder.service - TimeAgent Recorder
   Loaded: loaded (/etc/systemd/system/timeagent-recorder.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Mon 2017-03-20 16:30:17 GMT; 42min ago
  Process: 10929 ExecStop=/usr/local/bin/bundle exec eye quit --stop-all -t 600 (code=exited, status=0/SUCCESS)
  Process: 11409 ExecStart=/usr/local/bin/bundle exec eye load recorder.eye (code=killed, signal=TERM)
 Main PID: 9236 (code=killed, signal=TERM)

Mar 20 16:30:16 Ti systemd[1]: Starting TimeAgent Recorder...
Mar 20 16:30:17 Ti systemd[1]: Stopped TimeAgent Recorder.
Mar 20 16:30:17 Ti systemd[1]: timeagent-recorder.service: Start request repeated too quickly.
Mar 20 16:30:17 Ti systemd[1]: Failed to start TimeAgent Recorder.
Mar 20 16:30:20 Ti systemd[1]: Stopped TimeAgent Recorder.
Mar 20 16:30:20 Ti systemd[1]: timeagent-recorder.service: Start request repeated too quickly.
Mar 20 16:30:20 Ti systemd[1]: Failed to start TimeAgent Recorder.
Mar 20 16:30:20 Ti systemd[1]: Stopped TimeAgent Recorder.
Mar 20 16:30:20 Ti systemd[1]: timeagent-recorder.service: Start request repeated too quickly.
Mar 20 16:30:20 Ti systemd[1]: Failed to start TimeAgent Recorder.

관련 출력도 다음과 같습니다.

$ systemctl show timeagent-recorder | grep -i restart
Restart=always
RestartUSec=15s

위에서 볼 수 있듯이 서비스와 데몬 다시 로드를 활성화했는지 확인했습니다. 활성화되어 있고 systemd가 서비스를 시작하려고 시도하지만 RestartSec를 완전히 무시합니다.

저는 Ubuntu 16.04.1 LTS를 사용하고 있으며 시스템 버전은 229-4ubuntu10입니다.

RestartSec=15가 존중되지 않는 이유를 아시나요? - RestartSec=15s를 사용해 보았지만 아무런 차이가 없었습니다.

편집하다:

제안된 대로 "필요"를 "원함"으로 변경했지만 문제가 계속 발생합니다. 자세한 내용을 보여주는 관련 로그는 다음과 같습니다.

# journalctl -f -u timeagent-recorder
Mar 26 20:18:21 Ti bundle[7030]: Config loaded!
Mar 26 20:18:21 Ti systemd[1]: Started TimeAgent Recorder.
Mar 26 22:17:06 Ti systemd[1]: Stopping TimeAgent Recorder...
Mar 26 22:17:08 Ti bundle[22989]: Eye quit ಠ╭╮ಠ (/home/deployer)
Mar 26 22:17:08 Ti systemd[1]: Stopped TimeAgent Recorder.
Mar 26 22:17:08 Ti systemd[1]: Starting TimeAgent Recorder...
Mar 26 22:17:09 Ti bundle[23272]: Eye started! ㋡ (/home/deployer)
Mar 26 22:17:09 Ti systemd[1]: Stopped TimeAgent Recorder.
Mar 26 22:17:09 Ti systemd[1]: Starting TimeAgent Recorder...
Mar 26 22:17:09 Ti systemd[1]: timeagent-recorder.service: Control process exited, code=exited status=1
Mar 26 22:17:09 Ti systemd[1]: Stopped TimeAgent Recorder.
Mar 26 22:17:09 Ti systemd[1]: timeagent-recorder.service: Unit entered failed state.
Mar 26 22:17:09 Ti systemd[1]: timeagent-recorder.service: Failed with result 'exit-code'.
Mar 26 22:17:09 Ti systemd[1]: Starting TimeAgent Recorder...
Mar 26 22:17:09 Ti systemd[1]: Stopped TimeAgent Recorder.
Mar 26 22:17:09 Ti systemd[1]: Starting TimeAgent Recorder...
Mar 26 22:17:10 Ti systemd[1]: Stopped TimeAgent Recorder.
Mar 26 22:17:10 Ti systemd[1]: Starting TimeAgent Recorder...
Mar 26 22:17:10 Ti systemd[1]: Stopped TimeAgent Recorder.
Mar 26 22:17:10 Ti systemd[1]: timeagent-recorder.service: Start request repeated too quickly.
Mar 26 22:17:10 Ti systemd[1]: Failed to start TimeAgent Recorder.
Mar 26 22:17:10 Ti systemd[1]: Stopped TimeAgent Recorder.
Mar 26 22:17:10 Ti systemd[1]: timeagent-recorder.service: Start request repeated too quickly.
Mar 26 22:17:10 Ti systemd[1]: Failed to start TimeAgent Recorder.

답변1

나는 당신이 겪고 있는 행동이 당신의 의존성 때문이라고 생각합니다 Requires=. 다음 Requires=섹션 에 따르면 man systemd.unit:

다른 장치 중 하나가 비활성화되거나 활성화되지 않으면 이 장치가 비활성화됩니다.

여기서 무슨 일이 일어나고 있는지 들리는 것 같습니다. 이 단락 뒷부분에는 이 상황에 적용되는 조언이 있습니다.

일반적으로 실패한 서비스에 대해 시스템을 더욱 강력하게 만들려면 Requires= 대신 Wants=를 사용하는 것이 좋습니다.

문서에는 다음 Wants=과 같이 나와 있습니다.

Requires=의 약한 버전입니다. 하이브가 이미 시작된 경우 이 옵션에 나열된 장치가 시작됩니다. 그러나 나열된 장치가 활성화되지 않거나 거래에 추가될 수 없는 경우 이는 전체 거래의 유효성에 영향을 미치지 않습니다. 이는 한 장치의 시작을 다른 장치의 시작에 연결하는 권장 방법입니다.

다른 방식으로 답변: "RequireSec=" 조건이 충족되지 않아 systemd가 서비스를 종료하기 때문에 "RequireSec=" 논리를 시작할 기회가 없다고 생각합니다.

이것은 내 추측이다.

관련 정보