시스템화된 "ConsistsOf" 관계를 정의하는 방법

시스템화된 "ConsistsOf" 관계를 정의하는 방법

foo업스트림 패키지를 시작/중지하는 패키지를 만들고 있습니다 bar. 관계는 다음과 같아야 합니다.

  • foo를 시작하면 bar도 시작됩니다.
  • foo를 중지/다시 로드하면 bar도 중지/다시 로드됩니다.
  • bar영향을 주지 않고 시작, 중지 또는 다시 로드 가능foo

/lib/systemd/system/bar.service다음과 같은 경우 :

[Unit]
Description=Bar

[Service]
ExecStart=/bin/sleep infinity
Restart=on-failure

그런 다음 "일반적인" 솔루션은 WantedByAND PartOf관계를 추가하는 것입니다 bar.

[Unit]
Description=Bar
PartOf=foo.service

[Service]
ExecStart=/bin/sleep infinity
Restart=on-failure

[Install]
WantedBy=foo.service

하지만 업스트림 패키지이기 때문에 지식을 강요하거나 패치를 적용하는 bar것은 옳지 않다고 생각합니다.barfoobar

완벽한 해결책은 foo.service다음과 같이 만드는 것입니다.

[Unit]
Description=Foo
Wants=bar.service
ConsistsOf=bar.service

[Service]
Type=oneshot
ExecStart=/bin/true
RemainAfterExit=yes

그러나 내 Journalctl은 다음과 같이 말합니다.

'Unit' 섹션의 알 수 없는 lvalue 'ConsistsOf'

그리고매뉴얼 페이지설명하다:

a.service에서 PartOf=b.service를 사용하는 경우 이 종속성은 b.service의 속성 목록에 ConsistsOf=a.service로 표시됩니다.ConsistsOf= 종속성을 직접 지정할 수 없습니다.

나는 전혀 모른다 ConsistsOf=직접적으로 지정할 수는 없지만, 제가 고려하지 않은 대안이 있나요?

답변1

다른 장치에 대한 관계를 포함하도록 업스트림/외부 bar.service를 수정하는 적절한 방법 PartOf=은 원본 파일을 건드리지 않고 기존 장치를 수정할 수 있는 시스템 기능인 "직접" 재정의 구성을 사용하는 것입니다.

~에서시스템 장치매뉴얼 페이지:

유닛 파일 외에도 foo.service"insert" 디렉터리가 있을 수 있습니다. 이 디렉터리에서 " " 접미사가 붙은 foo.service.d/모든 파일은 .conf단위 파일 자체가 구문 분석된 후에 구문 분석됩니다. 이는 유닛 파일을 수정하지 않고 유닛의 구성 설정을 변경하거나 추가하는 데 유용합니다.

/etc/systemd/system/bar.service.d/partof-foo.conf특정한 경우에는 다음과 같은 내용을 포함하는 삽입물을 만들어야 합니다 .

[Unit]
PartOf=foo.service

(이름은 partof-foo.conf단지 제안일 뿐이며 .conf접미사가 있는 모든 이름이 작동합니다.)

그런 다음 reload 데몬을 사용하십시오 systemctl daemon-reload.

완료되면 검사 장치를 사용할 수 있으며 systemctl cat bar이는 적용 범위가 고려되고 있음을 명확하게 보여줍니다. 또한 이제 와의 관계가 systemctl show foo표시되고 해당 관계의 효과가 따릅니다. (중지 하면 중지가 발생합니다 .)ConsistsOf=bar.servicefoobar

두 번째 부분( foohave )에서는 해당 지시문을 사용하는 대신 "insert" 섹션 Wants=bar.service에 직접 추가하는 것이 좋습니다 .foo.service[Install]bar.service

우선 이 [Install]부분은 systemctl enable bar명령어를 이용하여 활성화시켜야 하기 때문에 유지관리가 다소 어렵다. (또한 "삽입"이 존중되지 않는 버그를 발견했습니다 [Install]. 이러한 버그는 수정되었다고 생각하지만 배포판 시스템에는 여전히 존재할 수 있습니다.)

또한 시작되지 않으면 실패 Requires=하므로 더 강력한 관계를 대신 사용하는 것이 좋습니다 . Wants=(from 과 같은 정렬 종속성을 추가하는 것도 고려하여 자체 시작을 수행하기 전에 실제로 가 작동될 때까지 기다립니다.)foo.servicebar.serviceAfter=bar.servicefoo.servicefoobar

foo.service이는 귀하가 제어하는 ​​파일 이므로 직접 포함시키십시오.

[Unit]
Description=Foo
Requires=bar.service
After=bar.service

순서 종속성도 필요하다고 가정하면 그렇지 않은 경우 안전하게 무시할 수 있습니다.

이렇게 하면 모든 것이 해결됩니다.

관련 정보