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
이 서비스는 언급된 파일이 존재하는 경우에만 서비스를 활성화합니다.