foo
업스트림 패키지를 시작/중지하는 패키지를 만들고 있습니다 bar
. 관계는 다음과 같아야 합니다.
- foo를 시작하면 bar도 시작됩니다.
- foo를 중지/다시 로드하면 bar도 중지/다시 로드됩니다.
bar
영향을 주지 않고 시작, 중지 또는 다시 로드 가능foo
/lib/systemd/system/bar.service
다음과 같은 경우 :
[Unit]
Description=Bar
[Service]
ExecStart=/bin/sleep infinity
Restart=on-failure
그런 다음 "일반적인" 솔루션은 WantedBy
AND PartOf
관계를 추가하는 것입니다 bar
.
[Unit]
Description=Bar
PartOf=foo.service
[Service]
ExecStart=/bin/sleep infinity
Restart=on-failure
[Install]
WantedBy=foo.service
하지만 업스트림 패키지이기 때문에 지식을 강요하거나 패치를 적용하는 bar
것은 옳지 않다고 생각합니다.bar
foo
bar
완벽한 해결책은 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.service
foo
bar
두 번째 부분( foo
have )에서는 해당 지시문을 사용하는 대신 "insert" 섹션 Wants=bar.service
에 직접 추가하는 것이 좋습니다 .foo.service
[Install]
bar.service
우선 이 [Install]
부분은 systemctl enable bar
명령어를 이용하여 활성화시켜야 하기 때문에 유지관리가 다소 어렵다. (또한 "삽입"이 존중되지 않는 버그를 발견했습니다 [Install]
. 이러한 버그는 수정되었다고 생각하지만 배포판 시스템에는 여전히 존재할 수 있습니다.)
또한 시작되지 않으면 실패 Requires=
하므로 더 강력한 관계를 대신 사용하는 것이 좋습니다 . Wants=
(from 과 같은 정렬 종속성을 추가하는 것도 고려하여 자체 시작을 수행하기 전에 실제로 가 작동될 때까지 기다립니다.)foo.service
bar.service
After=bar.service
foo.service
foo
bar
foo.service
이는 귀하가 제어하는 파일 이므로 직접 포함시키십시오.
[Unit]
Description=Foo
Requires=bar.service
After=bar.service
순서 종속성도 필요하다고 가정하면 그렇지 않은 경우 안전하게 무시할 수 있습니다.
이렇게 하면 모든 것이 해결됩니다.