systemd에서 After =와 Need =의 차이점은 무엇입니까?


53

나는 systemd .service 파일을 생성 그리고 난 사이의 차이점을 이해하는 데 도움이 필요 Requires=하고를 After=. 매뉴얼 페이지 말한다 Requires="다른 장치에 대한 요구 사항 종속성을 구성합니다." 과 After="단위 사이의 순서 종속 관계를 구성합니다." 차이점이 뭐야?

답변:


43

After=Requires=상태에 따라 서비스 순서를 구성합니다 (Y 다음에 X 만 수행) . 주문을 지정하지 않으면 다른 주문에 따라 다른 서비스에 따라 서비스가 시작됩니다. 또한, (나는 지금을 테스트 할 수 없습니다 및 참조를 찾을 수없는 있지만) 내가 이해하는 방식은 After=여전히 실행하는 것 "느슨한 결합"와 같은 문을 사용하여 서비스 인에 명명 된 하나의 경우 After=라인 ISN 반면 't는 모든 시작 Require=이 요구 사항이 충족되지 않는 경우 시작입니다 방지합니다.

인용 https://www.freedesktop.org/software/systemd/man/systemd.unit.html :

필요 =

다른 장치에 대한 요구 사항 종속성을 구성합니다. 본 기기가 활성화되면 여기에 나열된 기기도 활성화됩니다. 다른 장치 중 하나가 비활성화되거나 활성화에 실패하면이 장치가 비활성화됩니다. 이 옵션은 두 번 이상 지정되거나 공백으로 구분 된 여러 단위가 하나의 옵션으로 지정 될 수 있으며,이 경우 나열된 모든 이름에 대한 요구 사항 종속성이 작성됩니다. 요구 사항 종속성은 서비스가 시작되거나 중지되는 순서에 영향을 미치지 않습니다. After = 또는 Before = 옵션을 사용하여 독립적으로 구성해야합니다. 유닛 foo.service에 Required =로 구성된대로 유닛 bar.service가 필요하고 After = 또는 Before =로 순서가 구성되지 않은 경우, foo.service가 활성화 된 경우 두 유닛이 동시에 시작되고 지연되지 않습니다. 자주,

전 =, 후 =

공백으로 구분 된 단위 이름 목록. 장치 간의 순서 종속성을 구성합니다. 장치 foo.service에 Before = bar.service 설정이 있고 두 장치가 모두 시작되는 경우, foo.service가 시작될 때까지 bar.service의 시작이 지연됩니다. 이 설정은 Requirements =에 의해 구성된 요구 사항 종속성과 독립적이며 직교합니다. After = 및 Requires = 옵션 모두에 장치 이름을 포함시키는 것이 일반적인 패턴입니다.이 경우 나열된 장치가이 옵션으로 구성된 장치보다 먼저 시작됩니다. 이 옵션은 두 번 이상 지정 될 수 있으며,이 경우 나열된 모든 이름의 순서 종속성이 작성됩니다. After =는 Before =의 역수입니다. 즉 After After =는 나열된 장치가 시작된 후 구성된 장치가 시작되도록하고 Before =는 반대입니다. 나열된 장치가 시작되기 전에 구성된 장치가 완전히 시작되었는지 확인하십시오. 순서 의존성이있는 두 장치가 종료되면 시작 순서의 반대가 적용됩니다. 즉, 다른 장치에서 After =로 장치를 구성한 경우 두 장치가 모두 종료되면 전자가 후자보다 먼저 중지됩니다. 두 장치간에 순서 종속성이있는 경우 한 장치가 종료되고 다른 장치가 시작되면 시작 전에 종료가 순서화됩니다. 순서 종속성이 After = 또는 Before =인지는 중요하지 않습니다. 또한 하나가 종료되고 다른 하나가 시작되는 한 둘 중 어느 것이 종료되는지는 중요하지 않습니다. 종료는 모든 경우에 시작하기 전에 주문됩니다. 두 장치 사이에 주문 종속성이 없으면 동시에 종료되거나 시작됩니다.


7
명령서가 아닌 경우 종속성은 무엇입니까? (
진실

내 편집을 참조하십시오. 나의 이해 : After=X"X 후이 작업을 수행 의미 하는 경우 동안, X가 이루어집니다" Require=X의미 "당신은 X를 할 수없는 경우 모든이 작업을 수행하지 않습니다."
Sven

Before=매뉴얼 페이지 의 섹션에서이를 확인하는 것 같습니다. If a unit foo.service contains a setting Before=bar.service and both units are being started, bar.service's start-up is delayed until foo.service is started up 내가 이해하는 방식으로, 주문이 bar.service시작되지 않고 foo.service정상적으로 시작 되면 주문이 시행 되지 않습니다 .
Sven

9

가장 큰 차이점 중 하나는

  • After 장치가 이미 활성화되어 있는지 확인하고 지정된 장치를 명시 적으로 활성화하지 않습니다.
  • 에 나열된 장치 Requires는 장치와 함께 활성화됩니다. 필요한 장치가 시작되지 않으면 장치가 활성화되지 않은 것입니다.

단위 파일이 있다고 가정 해 보겠습니다 test-app.service.

[Unit]
Description=test app
After=network-online.target

이 문장이 실행될 때 일어날 일은 다음과 같습니다.

  • After여부를 확인합니다 network-online.target.
  • 경우에 network-online.target시작되지, 그것을 기다립니다.
  • test-appnetwork-online.target활성화 된 후에 만 시작

내가 Requires대신 했다면

[Unit]
Description=test app
Requires=network-online.target

이 문장이 실행될 때 일어날 일은 다음과 같습니다.

  • network-online.targettest-app함께 활성화
  • 경우는 network-online.target시작되지 test-app활성화되지 않습니다.

2

systemd는 작업 관리자입니다. 매뉴얼 페이지는 작업 방식에 대해 매우 정확하지 않습니다.

부팅 할 때 systemd는 앵커 작업을위한 작업 (즉, default.target을위한 작업 시작)으로 구성된 트랜잭션을 빌드합니다. 이러한 모든 종속성과 관계는 트리거되는 작업과 작업을 정의합니다. 순서는 다른 모든 작업이 대기 할 작업을 정의합니다. 따라서 default.target 단위는이 모든 것의 중심에 있습니다. 따라서 단위를 활성화 할 때 systemctl enable을 통해 순방향 종속성을 나타내는 파일 시스템 심볼릭 링크를 생성하는 역 종속성을 사용하는 이유는 무엇입니까? 처음). 일부 단위를 수동으로 시작한 경우 해당 단위가 앵커이고 트랜잭션이 계산됩니다.

너무 자세하게 설명하지 않고, Require =와 After =의 기능을 설명하겠습니다.

Requirements =는 시작 작업이 트리거 될 때 (명시 적으로 또는 종속성을 통해 내부적으로 구별이 없음) systemd가 필수 단위에 대한 시작 작업을 트리거하게합니다. 또한이 장치가 중지 (정지, 중지되지 않음)되거나 다시 시작될 때 중지 작업을 트리거하는 속성도 있습니다. 즉, 일부 종속성 / systemctl로 인해 중지 / 다시 시작하면 중지 / 다시 시작됩니다. 그러나 자체적으로 다운되면 작업이 없기 때문에 중지하지 않으며 시스템 변경없이 상태 변경이 발생합니다. 바로 BindsTo =를 사용하는 곳입니다 (명백한 이유로 시스템의 개입없이 비활성화 될 수있는 장치 장치와 유사 함).

이제 After =를 사용하는 것이 권력을 가지기 때문에 Rape를 사용하는 것이 좋습니다. 시작 작업이 실패하면 requiree를 취소하십시오. 그러나이 취소는 wrt 작업, 즉 다른 장치가 순서를 정의하지 않으면 시스템 트리거를 동시에 병렬로 시작하고 시작 작업이 실패하기 전에 시작 작업이 완료되면 취소되지 않습니다 (실제로 취소 할 수 없음) . After = 사용은 필요한 작업의 시작 작업이 완료 될 때까지 다른 작업이 계속 대기하고 있음을 의미하며, 결과에 따라 실패한 경우 작업 대기 작업이 JOB_DEPENDENCY 작업 결과로 취소됩니다 (노란색 [DEPEND]을 사용하는 이유) 이러한 경우 부팅시). 따라서이 무효화 효과는 After =를 사용하지 않고 결정적이지 않습니다.

다른 유닛의 시작을 기다리지 않으려면 After =없이 Wants =를 사용하는 것이 좋습니다. 무효화가 없기 때문에 경쟁이 없습니다. 이 경우 이는 동기화 메커니즘에 지나지 않습니다.

또한 부팅시 둘 다 활성화 할 수 있으며 서로를 요구하지 않고 순서 만 정의 할 수 있습니다.이 경우 둘 다 동일한 트랜잭션의 일부로 풀될 때 순서가 지정됩니다 (또는 다른 작업이 트리거 된 경우). 실행하려는 장치의 작업이 실행되는 동안 먼저 트랜잭션을 통해 완료 될 때까지 기다립니다.

이제 작업이 없으면 주문은 해당 장치에 영향을 미치지 않습니다. 그러나 일반적으로 require = 및 Wants =와 같은 종속성을 사용하거나 한 번에 가져 와서 일부 순서를 정의한 결과로 작업이 있습니다.이 경우 다른 장치의 작업을 기다립니다.

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