필수 장치가 처음 실패하면 SystemD "필요"가 실패합니다.

필수 장치가 처음 실패하면 SystemD "필요"가 실패합니다.

다른 장치를 미리 시작해야 하는 서비스를 시작하기 위해 SystemD 장치를 만들었습니다.

부팅 중에 자동으로 시작될 때 먼저 시작을 시도 Requires=dependant.service하도록 종속 서비스를 설정했습니다 .depending.servicedependant.service

문제는 dependant.service너무 일찍 시작하면 시작되지 않는다는 것입니다(여기서 "너무 일찍"이 무엇을 의미하는지 잘 모르겠습니다). 이 문제를 해결하기 위해 dependant.service로 설정했습니다 Restart=always.

그리고 그것은 잘 작동합니다. depending.service활성화되고 자동 시작되고, 시작되고 dependant.service, 충돌한 다음 다시 시작되고, 항상 두 번째 시도에서 성공적으로 시작됩니다.

그러나 첫 번째 실패와 그 이유가 depending.service밝혀졌습니다 . 로그에는 다음이 표시됩니다.dependant.serviceRequires=dependant.service

systemd[1]: Dependency failed for depending.
systemd[1]: Job depending.service/start failed with result 'dependency'.

dependant궁극적으로 성공했지만 둘 다 초기 실패 이후 다시 시작되지 Restart=always않았습니다 .dependingdependant

Requires=, , 및 Wants=의 다양한 구성을 시도했지만 재부팅 후 재부팅을 유발하는 조합을 찾지 BindsTo=못했습니다 .Afterdependingdependant

답변1

근본 원인이 dependant.service너무 일찍 시작되는 경우가 있는 것 같습니다. Restart지침을 추가하는 것이 약간 번거롭기 때문입니다. 나에게 이것은 시간 요구 사항이 부족하다는 것을 보여줍니다 After. 서비스 유형에 따라 서비스를 시작하기 전에 어떤 리소스가 필요한지 확인해야 합니다.

[Unit]이것이 네트워크와 관련되어 있다고 가정하면 섹션에 다음을 추가 해야 합니다 dependant.service.

After=network.target

이렇게 하면 systemd가 서비스를 시작하기 전에 기본 네트워킹을 사용할 수 있어야 함을 나타냅니다. 그렇지 않으면 systemd는 가능한 한 많은 서비스를 병렬로 시작하려고 시도합니다. 즉, 시작 순서에 따라 본질적으로 전혀 초기화가 이루어지지 않을 수 있으며 일부 서비스는 허용되고 다른 서비스는 끔찍하게 실패하는 상황이 발생할 수 있습니다.

depending.service항상 재부팅 하려면 다음 dependant.service항목 에 BindsTo및를 추가하세요 .Afterdepending.service

[Unit]
After=dependant.service
BindsTo=dependant.service

이러한 작업은 다음에 기록됩니다.systemd.unit(7)맨 페이지.Wants, Requires및 이상을 사용할 필요는 거의 없지만 After서비스 시작 조건이 특히 복잡한 경우에는 더 고급 옵션이 있습니다.

나는 새로운 서비스(또는 서비스 그룹)를 생성할 때 배포판에서 제공하는 단위 파일을 살펴보고 어떻게 수행되는지 확인하고 좋은 부분(try /usr/lib/systemd/system또는 )을 뻔뻔하게 복사하는 것이 도움이 된다고 생각합니다. 리드 및 요구 사항 /lib/systemd/system에 대해 일반적으로 찾는 내용은 다음 과 같습니다. 특정 유형의 서비스에 유용합니다.AfterRequires

답변2

나에게 도움이되지 않습니다 BindsTo. 이것은 (제 생각에는) BindsTo종속 장치가 그것 없이는 실행될 수 없다는 것을 의미하기 때문입니다. 하지만 이 경우 슬레이브 장치가 처음으로 시작에 실패했기 때문에 슬레이브 프로세스가 아직 시작되지 않았습니다.

그러나 따르면시스템 단위에 대한 문서 PartOf이벤트는 다시 시작할 때마다 전파됩니다. 그래서 이것은 나에게 효과적입니다.

[Unit]
After=dependant.service
PartOf=dependant.service

관련 정보