StartLimitInterval 후 시스템 서비스 자동 재시작


33

실패시 시스템 서비스가 자동으로 다시 시작되기를 원합니다. 또한 재시작 횟수를 제한하고 싶습니다. 90 초 동안 최대 3 번의 재시작을 허용하려고합니다. 따라서 다음 구성을 수행했습니다.

[서비스]
Restart = 항상
StartLimitInterval = 90
StartLimitBurst = 3

이제 서비스가 실패하면 다시 시작됩니다. 3 개의 빠른 실패 / 레스토랑 후에는 더 이상 예상대로 다시 시작되지 않습니다. 이제 타임 아웃 (StartLimitInterval) 후에 systemd가 서비스를 시작할 것으로 예상했습니다. 그러나 시간 초과 후 서비스를 수동으로 다시 시작하면 systemd는 시간 초과 (90 초) 후에 서비스를 자동으로 시작하지 않습니다. 그러나 StartLimitInterval 이후에 systemd가 서비스를 자동으로 시작하기를 원합니다. 이 기능을 달성하는 방법에 대해 알려주십시오.


3
서비스를 만드는 방법 과이 특별한 문제를 피하는 방법을 설명하는 기사를 작성했습니다 : systemd로 Linux 서비스 만들기 .
Benjamin

2
나는 당신이 찾고있는 StartLimitIntervalSec것이 아니라고 생각합니다 StartLimitInterval.
Marc Tamsky

답변:


29

서비스를 90 초 간격으로 3 번 다시 시작하려면 시스템 서비스 파일에 다음 줄을 포함하십시오.

Restart=always
RestartSec=90
StartLimitInterval=400
StartLimitBurst=3

이것은 'Type = idle'을 사용하여 스크립트를 실행하는 서비스에서 저에게 효과적이었습니다. 'StartLimitInterval'은 'RestartSec * StartLimitBurst'보다 커야합니다. 그렇지 않으면 서비스가 무기한으로 재시작됩니다.

systemd가 이러한 옵션을 사용하는 방법을 해결하는 데 많은 시행 착오를 겪는 데 시간이 걸렸습니다. 이는 systemd가 원하는 것만 큼 잘 문서화되지 않았 음을 나타냅니다. 이 옵션은 효과적으로 재시도주기 시간과 최대 재시도 횟수를 제공합니다.


이것은 허용 된 답변으로 표시되어야합니다 ...
Jeff

StartLimitInterval=최신 우분투 18에서 지시문을 찾을 수 없습니다 ...
wick

10

설명하는 동작은 설명서와 일치합니다.

StartLimitInterval =, StartLimitBurst = 서비스 시작 속도 제한을 구성합니다. 기본적으로 10 초 내에 5 번 이상 시작된 서비스는 10 초 간격이 끝날 때까지 더 이상 시작할 수 없습니다. 이 두 가지 옵션을 사용하면이 속도 제한을 수정할 수 있습니다. StartLimitInterval =을 사용하여 점검 간격을 구성하십시오 (관리자 구성 파일에서 기본값은 DefaultStartLimitInterval =이며, 모든 종류의 속도 제한을 사용하지 않으려면 0으로 설정 됨). 간격 당 시작이 허용되는 횟수를 구성하려면 StartLimitBurst =를 사용하십시오 (관리자 구성 파일에서 기본값은 DefaultStartLimitBurst =입니다). 이 구성 옵션은 Restart =와 함께 특히 유용합니다. 그러나 Restart = 논리에 의해 트리거 된 것만이 아니라 모든 종류의 시작 (수동 포함)에 적용됩니다.Restart =에 대해 구성되고 시작 한계에 도달 한 장치는 더 이상 다시 시작되지 않습니다. 그러나 나중에 다시 수동으로 다시 시작될 수 있으며이 시점부터 다시 시작 논리가 다시 활성화됩니다. systemctl reset-failed로 인해 서비스의 재시작 속도 카운터가 플러시됩니다. 이는 관리자가 수동으로 서비스를 시작하려고하고 시작 제한이이를 방해하는 경우에 유용합니다.

나는 아직도 당신이 원하는 행동을 달성하는 방법을 알아 내려고 노력하고 있습니다.


이것은 지적한대로 답변보다 더 많은 의견입니다.
Dave M

정확히 내가 필요한 것, ty
일부 Linux Nerd

연결 한 문서에 따르면 StartLimitIntervalSec=(및 DefaultStartLimitIntervalSec=) 해서는 안 됩니까? Sec두 매개 변수 이름 모두에 추가하십시오 .
Doktor J

6

몇 년 후 체계적으로 232 를 사용하면 질문과 2016의 답변에 설명 된 것처럼 더 이상 작동하지 않습니다. 옵션 이름 StartLimitIntervalSec과 섹션이 변경되었습니다. 이제 다음 예제와 같아야합니다.

[Unit]
StartLimitBurst=5
StartLimitIntervalSec=33

[Service]
Restart=always
RestartSec=5
ExecStart=/bin/sleep 6

이렇게하면 30 초 (5 * 6)에 5 번 다시 시작하고 33 초에 1 번 다시 시작합니다. 따라서 33 초에 6 번의 재시작이 있습니다. 33 초 안에 5 번의 재시작 횟수를 초과했습니다. 따라서 재시작은 약 31 초 후에 5 카운트에서 중지됩니다.


1
StartLimitInterval문서화되지 않은 경우 Service섹션 에서 여전히 지원되는 것 같습니다 . 그러나 새로운 선호 StartLimitIntervalSec는에서 작동합니다 Unit.
Danek Duvall

1

OnFailure실패하면 다른 서비스를 시작하도록 설정할 수 있습니다 . 에서 온 실패 서비스 는 대기하는 스크립트를 실행 한 다음 서비스를 다시 시작 할 수 있습니다.

이를 설정하는 방법에 대한 샘플은 장치 장애시 시스템 상태 메일을 참조 하고 대신 서비스를 다시 시작하도록 수정하십시오.


1

사용할 수 있습니다 StartLimitAction=reboot. StartLimitInterval 후에 시스템이 재부팅됩니다.

StartLimitAction = StartLimitInterval = 및 StartLimitBurst =로 구성된 속도 제한에 도달 한 경우 수행 할 조치를 구성하십시오. none, reboot, reboot-force 또는 reboot-immediate 중 하나를 사용합니다. 아무 것도 설정하지 않으면 속도 제한에 도달하면 시작이 허용되지 않는 것 외에는 아무 작업도 트리거되지 않습니다. reboot는 정상적인 종료 절차에 따라 재부팅합니다 (즉, systemctl reboot와 동일). reboot-force는 강제 재부팅으로 모든 프로세스를 강제로 종료하지만 재부팅시 더티 파일 시스템이 발생하지 않아야합니다 (즉, systemctl reboot -f와 동일). reboot-immediate는 즉시 reboot (2) 시스템 호출을 실행하여 결과적으로 발생할 수 있습니다. 데이터 손실. 기본값은 none입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.