Systemd Restart=항상 준수되지 않음

Systemd Restart=항상 준수되지 않음

참고: 저는 서비스를 생성하는 방법과 이 특정 문제를 피하는 방법을 설명하는 기사를 Medium에 썼습니다.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강제 로 할 수 있는 방법은 없나요언제나다시 시도하려면 몇 초가 소요됩니까?

답변1

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

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

실행 간의 기본 지연은 100밀리초(RestartSec) 이로 인해 속도 제한에 매우 빠르게 도달할 수 있습니다.

systemd는 더 이상 장치에 대해 자동으로 다시 시작을 시도하지 않습니다.재시작 전략 정의:

구성되어 시작 제한에 도달한 장치 는 Restart=더 이상 다시 시작을 시도하지 않지만 나중에 수동으로 다시 시작할 수 있으며 이 시점부터 다시 시작 논리가 다시 활성화됩니다.

지연 시간이 길어지면 해당 시간 내에 오류 카운터에 도달하지 못하므로 Rahul의 답변이 도움이 되었습니다 StartLimitIntervalSec. 정답은 RestartSec및 를 모두 StartLimitBurst합리적인 값으로 설정하는 것입니다.

답변2

, 가지다. 섹션에서 x재시도하기 전에 대기할 시간(초)을 지정할 수 있습니다 [Service].

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

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

systemctl daemon-reload

그런 다음 서비스를 다시 시작하여 변경 사항을 활성화합니다.

systemctl restart test

요청한대로 설명서를 확인하십시오.

Restart=on-failure

좋은 추천인 것 같습니다.

답변3

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

아니요, systemd는 다시 시작하는 것을 포기합니다.잠시. 이는 귀하가 제공한 로그에 명확하게 표시되어 있습니다.

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

여기서 속도 제한이 시작됩니다.

임시 길이는 서비스 단위의 설정을 사용하여 지정됩니다 StartLimitIntervalSec=. 이 설정은 이 간격 내에서 속도 제한 메커니즘을 트리거하는 데 필요한 시작 횟수를 지정합니다 StartLimitBurst=. 이 두 설정의 기본값을 포함하여 시스템에 일반 systemd와 다른 점이 없으면 10초에 5배씩 증가합니다.

StartLimitIntervalSec=0속도 제한을 비활성화하여 systemd가 포기하지 않고 항상 재시도하도록 합니다. 그러나 더 나은 접근 방식은 서비스 종료 빈도를 줄이거나 종료 및 다시 시작 사이에 속도 제한 임계값을 초과하지 않을 만큼 충분히 유휴 상태를 유지하는 것입니다.

속도 제한은 서비스가 종료되는 방식에 상관하지 않습니다. 원인에 관계없이 부팅/재시작 시도 횟수에 따라 트리거됩니다.

추가 읽기

답변4

그 후에도 서비스가 다시 시작되지 않으면 reboot이전에 활성화했는지 확인하세요.

sudo systemctl enable your.service

관련 정보