예:

예:

init 스크립트를 systemd로 다시 작성하려고 하는데 선택적 종속성으로 인해 어려움을 겪고 있습니다.

내 서비스(선택 사항)는 두 가지 다른 서비스에 따라 달라집니다. 이 두 가지 종속성은 상호 배타적입니다(서버 패키지와 클라이언트 패키지). 한 번에 하나만 설치할 수 있으며 완전히 누락될 수 있습니다.

종속성이 설치된 경우 해당 종속성은 서비스보다 먼저 시작되어야 하며, 시작에 실패하면 서비스가 시작되지 않아야 합니다.

그러나 두 종속성이 모두 설치되지 않은 경우 서비스가 정상적으로 시작됩니다.

이 기능을 어떻게 구현할 수 있나요? 선택적 종속성은 을 통해 처리되지만 Wants=오류는 무시됩니다.

답변1

종속성을 제어할 수 있는 경우(즉, 소프트웨어인 경우) 관련 유닛 파일의 내장 파일을 설치하도록 하세요. 즉, foo.service의존성이 필요한 것이 있다고 가정합니다 bar.service || baz.service.

그러면 패키지는 다음을 포함하는 bar파일을 설치할 수 있습니다./usr/lib/systemd/system/foo.service.d/50-bar-baz.conf

[Unit]
Requires=bar.service

가방도 마찬가지다 baz.


종속성을 제어할 수 없는 경우 유닛 파일이 존재하는지 확인한 다음 exec systemctl start선택한 유닛 파일에 대해 작업을 수행하는 "디스패처" 스크립트를 생성하면 됩니다. 그런 다음 별도의 단위를 작성하고 기본 단위 뒤에 require/를 추가합니다.

[Unit]
# inexistent unit names are ignored here
After=bar.service baz.service

[Service]
Type=oneshot
ExecStart=/path/to/dispatcher

답변2

시스템 경로 단위를 사용할 수 있습니다. 경로/파일이 존재하는지 확인하려면 서비스 파일에 해당 경로 단위가 있어야 합니다.

예:

service.path
[Unit]
Description:Service description

[Path]
PathExists=!/other/service/binary/path/or/some/other/file/from/that/package

[Install]
WantedBy=some-user.target

이 서비스는 언급된 파일이 존재하는 경우에만 서비스를 활성화합니다.

관련 정보