시스템:이후=

시스템:이후=

문맥

부팅이 완료되고 해당 시스템 경로 장치에 의해 장치가 활성화된 후에만 시작하고 싶습니다 A.service. 관련 코드 조각은 아래에서 찾을 수 있습니다.B.serviceB.serviceB.path

A.service:

[Unit]
After=B.service

B.path:

[Path]
PathExists=/some/path

[Install]
RequiredBy=A.service

질문

A.service부팅하는 동안 활성화 되고 B.path부팅 후에 B.service활성화되는 것을 볼 수 있지만 /some/path문제는 A.service부팅이 완료되기 전에 여전히 시작된다는 것입니다. B.service로그 로그를 검사하면 타임라인이 다음과 같이 표시됩니다.

  • T0:
    • A.service시작됨(설정이 에 의존하기 때문에 실패함 B.service)
    • B.path시작됨
  • T0+ X초:
    • B.service시작됨

X시작하는 동안 경로가 존재하는 시점에 따라 3~6 사이입니다.

문서

나는 systemd 문서를 확인했습니다 Before=, After=(협회) 그리고 이것을 발견했습니다:

장치 foo.service에 Before=bar.service 설정이 포함되어 있고 두 장치가 모두 시작되는 경우

이 부분 때문이 아닐까 하는 생각이 듭니다 both units are being started. 특히, B.service존재한 후에만 시작됩니다 . 이는 부팅 후 몇 초가 /some/path걸릴 수 있습니다 .XA.service

그러나 문서에 대한 나의 이해가 올바른지 또는 실제로 다른 것이 누락되었는지 확실하지 않습니다. 어느 쪽이든, 내가 원하는 것을 달성하기 위해 단위 파일을 작성하는 것에 대한 제안을 주시면 감사하겠습니다.감사해요!

답변1

문제의 실제 유닛 파일이 누락되어 답변하기가 약간 어렵지만 Before=/After=의 의미를 오해하고 있는 것 같습니다.

유닛 파일에서 "이전/이후"를 사용하는 의미는 둘 이상의 유닛 간의 우선순위 결정을 내릴 때 "이전/이후" 조건이 해당 유닛에서 작업이 수행되는 순서를 결정한다는 것입니다.

귀하의 경우에는 두 개의 서비스가 있는데 그 중 하나는 A.service두 번째 service 에 의존 B.service하지만 두 서비스에 종속성이 있음을 지정하지 않고 실행 순서만 지정합니다.만약에그들은 하나를 가지고 있습니다.

이 경우 다음 과 같이 참조 에 를 Requisite=설정 하려는 것처럼 들립니다 .Requires=Wants=A.serviceB.serviceA.Service

[Unit]
Requires=B.service
After=B.service

이 구성을 사용하면 활성화 서비스에 A.service활성화가 필요하며 B.service지시문 은 After=자체 지시문 실행을 완료하기 전에 A.service지시문 실행을 시작하지 않도록 합니다.ExecStart=B.serviceExecStart=

Requires=Wants=나열된 장치가 이미 활성화되어 있는지 확인할 뿐만 아니라 아직 활성화되지 않은 경우에도 활성화합니다 .

Requisite=장치가 실행 중인지 여부만 확인하고, 그렇지 않은 경우 정의한 장치는 즉시 실패합니다.

Before=그리고 After=동시에 호출되는 경우에만 장치의 활성화 순서를 지정하십시오. 그렇기 때문에 현재 구성에서 A.service이전에 활성화 할 수 있으므로 B.service현재 동시에 활성화되지 않으므로 순서 종속성이 적용되지 않습니다.

Before=A.service좋은 커버리지 영역을 설정하는 것도 가능합니다B.service

TLDR: 정의해야 합니다.둘 다 After=또한 Requires=. Requires=이미 실행 중이 아닌 경우 B.service동시에 활성화되도록 "필요"합니다 . 활성화할 시기 와 시기를 지정 A.service해야 합니다 . 그러면 이후 까지 실행이 지연됩니다 .After=A.serviceB.serviceA.serviceB.service

관련 정보