참고: 저는 서비스를 생성하는 방법과 이 특정 문제를 피하는 방법을 설명하는 기사를 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가 포기하지 않고 항상 재시도하도록 합니다. 그러나 더 나은 접근 방식은 서비스 종료 빈도를 줄이거나 종료 및 다시 시작 사이에 속도 제한 임계값을 초과하지 않을 만큼 충분히 유휴 상태를 유지하는 것입니다.
속도 제한은 서비스가 종료되는 방식에 상관하지 않습니다. 원인에 관계없이 부팅/재시작 시도 횟수에 따라 트리거됩니다.
추가 읽기
- 레나트 페틀링(2013-10-07).
systemd.unit
. 시스템 매뉴얼 페이지. freedesktop.org. - Systemd의 StartLimitIntervalSec 및 StartLimitBurst가 작동하지 않습니다.
답변4
그 후에도 서비스가 다시 시작되지 않으면 reboot
이전에 활성화했는지 확인하세요.
sudo systemctl enable your.service