Systemd Restart = 항상 유효하지 않습니다


53

참고 : 서비스 작성 방법 과이 특별한 문제를 피하는 방법을 설명하는 매체에 대한 기사를 작성했습니다 : systemd로 Linux 서비스 작성 .

원래 질문 :


작업자 스크립트를 항상 작동시키기 위해 systemd를 사용하고 있습니다.

[Unit]
Description=My worker
After=mysqld.service

[Service]
Type=simple
Restart=always
ExecStart=/path/to/script

[Install]
WantedBy=multi-user.target

몇 분 후에 스크립트가 정상적으로 종료되면 재시작이 제대로 작동하지만 시작시 반복적으로 실행되지 않으면 시작 systemd시도를 포기 한다는 것을 알았 습니다.

Jun 14 11:10:31 localhost systemd[1]: test.service: Main process exited, code=exited, status=1/FAILURE
Jun 14 11:10:31 localhost systemd[1]: test.service: Unit entered failed state.
Jun 14 11:10:31 localhost systemd[1]: test.service: Failed with result 'exit-code'.
Jun 14 11:10:31 localhost systemd[1]: test.service: Service hold-off time over, scheduling restart.
Jun 14 11:10:31 localhost systemd[1]: test.service: Start request repeated too quickly.
Jun 14 11:10:31 localhost systemd[1]: Failed to start My worker.
Jun 14 11:10:31 localhost systemd[1]: test.service: Unit entered failed state.
Jun 14 11:10:31 localhost systemd[1]: test.service: Failed with result 'start-limit'.

마찬가지로, 내 작업자 스크립트의 종료 상태로 여러 번 실패 할 경우 255, systemd다시 시작하려고 포기 :

Jun 14 11:25:51 localhost systemd[1]: test.service: Failed with result 'exit-code'.  
Jun 14 11:25:51 localhost systemd[1]: test.service: Service hold-off time over, scheduling restart.  
Jun 14 11:25:51 localhost systemd[1]: test.service: Start request repeated too quickly.  
Jun 14 11:25:51 localhost systemd[1]: Failed to start My worker.  
Jun 14 11:25:51 localhost systemd[1]: test.service: Unit entered failed state.  
Jun 14 11:25:51 localhost systemd[1]: test.service: Failed with result 'start-limit'.

강제 할 수있는 방법이 있나요 systemd위해 항상 몇 초 후에 다시 시도는?

답변:


53

Rahul의 답변을 조금 확장하고 싶습니다.

SystemD는 여러 번 다시 시작을 시도하고 ( StartLimitBurst) 시도 횟수에 도달하면 시도를 중지합니다 StartLimitIntervalSec. 두 옵션 모두 [unit]섹션 에 속합니다 .

실행 사이의 기본 지연은 100ms ( RestartSec)이며 속도 제한에 매우 빠르게 도달합니다.

재시작 정책이 정의 된 장치에 대해 SystemD는 더 이상 자동 재시작을 시도하지 않습니다 .

구성 Restart=되고 시작 한계에 도달 한 장치는 더 이상 다시 시작되지 않습니다. 그러나 나중에 다시 수동으로 다시 시작될 수 있으며이 시점부터 다시 시작 논리가 다시 활성화됩니다.

지연 시간이 길수록 오류 카운터에 도달하지 못하기 때문에 Rahul의 답변이 도움이 StartLimitIntervalSec됩니다. 정답은 모두 설정하는 것입니다 RestartSecStartLimitBurst하지만 합리적인 값에 있습니다.


5
시행 착오 후에 (최종) 작동 방식을 이해 했으므로 귀하의 답변이 가장 정확하다는 것을 알 수 있습니다. 나를위한 결론 : set StartLimitIntervalSec=0and voilà.
Benjamin

34

, 있습니다. 섹션에서 x몇 초 후에 다시 시도하도록 지정할 수 있습니다 [Service].

[Service]
Type=simple
Restart=always
RestartSec=3
ExecStart=/path/to/script

파일을 저장 한 후 데몬 구성을 다시로드 systemd하여 새 파일을 인식 해야 합니다.

systemctl daemon-reload

그런 다음 서비스를 다시 시작하여 변경 사항을 적용하십시오.

systemctl restart test

요청한대로 설명서를 보면

Restart=on-failure

괜찮은 추천처럼 들립니다.


실제로 작동하는 것 같습니다, 감사합니다! 따라서 RestartSec지시문 없이이를 더 잘 이해하려면 몇 systemd번의 시도가 매우 빠르게 다시 시작된 다음 영구적 인 실패 상태가됩니다. 뭔가 그 수 없습니다 때 발생하는 RestartSec지정?
Benjamin

또한, 나는 그것이 나의 근로자의 "정상적인"재시동을 지연시키는 것을 알아 차렸다. 실패한 재시작 만 지연시키는 방법이 있습니까?
Benjamin

@Benjamin 내 업데이트 확인
Rahul

@ Benjamin 더 많은 매개 변수를 보려면 여기 를 확인 하십시오 .
Rahul

3
에 의해 심사 문서 , always의 상위 집합입니다 on-failure, 그래서 도움이되지 않습니다!
Benjamin

4

systemd는 다시 시작하려고 포기합니다.

아니요. systemd는 잠시 동안 다시 시작하려고 하지 않습니다 . 이것은 사용자가 제공 한 로그에 명확하게 표시됩니다.

6 월 14 일 11:25:51 localhost systemd [1] : test.service : 'start-limit'결과가 실패했습니다 .

요율 제한입니다.

약간의 시간은 StartLimitIntervalSec=설정을 사용하여 서비스 유닛에 지정됩니다 . 속도 제한 메커니즘을 트리거하기 위해 해당 간격 내에서 필요한 시작 횟수는 StartLimitBurst=설정을 통해 지정됩니다 . 시스템에서이 두 설정의 기본값을 포함하여 바닐라 시스템과 다른 것이 없다면 10 초 내에 5 번입니다.

StartLimitIntervalSec=0속도 제한을 비활성화합니다. 그러나 서비스가 자주 종료되지 않거나 종료와 재시작 사이에 유휴 상태가되어 속도 제한 임계 값을 초과하지 않도록하는 것이 더 나은 방법입니다.

속도 제한은 서비스 종료 방법에 영향을주지 않습니다. 원인에 관계없이 시작 / 다시 시작하려는 시도 횟수를 트리거합니다.

추가 자료


5
"액티브 : 실패 (결과 : 시작-제한) 2016-06-15 01:21:24 CEST; 12 시간 전". 이 상태를 유지하며 스크립트는 다시 실행되지 않습니다. 나는 수동으로 설정하지 시도 StartLimitIntervalSec=10하고 StartLimitIntervalSec=5, 운이.
Benjamin

4
기본적으로 영구적으로 포기합니다. github.com/systemd/systemd/issues/2416을 참조하십시오 .
Adam Goode

2
결론 : 영구적으로 포기하지 않도록 설정하려면을 설정하십시오 StartLimitIntervalSec=0.
Benjamin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.