아마도 템플릿 단위를 사용하면 필요에 맞을 것입니다. systemd.unit(5)
선택적으로 런타임시 템플릿 파일에서 단위를 인스턴스화 할 수 있습니다. 이렇게하면 단일 구성 파일에서 여러 장치를 만들 수 있습니다. systemd가 유닛 구성 파일을 찾으면 먼저 파일 시스템에서 리터럴 유닛 이름을 검색합니다. 그 결과 성공하지 못하고 단위 이름에 "@"문자가 있으면 systemd는 같은 이름이지만 인스턴스 문자열 (즉, "@"문자와 접미사 사이의 부분)이 제거 된 단위 템플릿을 찾습니다. 예 : [email protected] 서비스가 요청되고 해당 이름의 파일이없는 경우 systemd는 getty @ .service를 찾고 해당 구성 파일에서 서비스를 인스턴스화합니다 (발견 된 경우).
구성 파일에서 인스턴스 문자열을 참조하려면 많은 구성 옵션에서 특별한 "% i"지정자를 사용할 수 있습니다. 자세한 내용은 아래를 참조하십시오.
그래서 당신은
[Unit]
Description=MyService component %i
PartOf=myservice.target
[Service]
Type=simple
ExecStart=/usr/local/bin/myservice %i
Restart=on-failure
같은과 MYSERVICE의 @에
[Unit]
Description=Myservice
[email protected] [email protected] [email protected]
공범자 = 사양과 마스터 유닛 myservice.target을 읽는 파일 MYSERVICE의 @의 .service을 만들 수 있습니다. 서비스는 대상이 중지되거나 다시 시작될 때 각 구성 요소가 제대로 작동하는지 확인합니다. Requires = in myservice.target myservice가 성공적으로 시작하려면 각 구성 요소를 시작해야합니다. 어떤 개별 구성 요소가 실패하더라도 실패하지 않은 것이 종료되어야하는 경우가되어야한다고 생각합니다. 즉 그것 모두 또는 아무것도. 원하는 것이 아니라면 Requires = 대신 Want =를 사용할 수 있습니다.
다소 어색하지만 여러 인수를 제공해야하는 경우 환경 변수를 통해 간접 참조를 도입 할 수 있습니다. 템플릿 단위의 경우 Environment=args=%i
을 추가하고 Execstart의 %i
을 $args
으로 바꿉니다. 그 대안을 찾는 것이 더 나을 것이라고 생각합니다. 그러나 유스 케이스에 대해 더 많이 알지 못하면 그 해결책이 무엇인지 확신 할 수 없습니다.
완벽! 고맙습니다! – chris01
질문 하나만 더하십시오 : 1 개 이상의 인수를 전달하는 방법은 무엇입니까? 시도해 보았습니다 = myservice @ "a 1".service 하지만 작동하지 않습니다 – chris01
@chris 어쩌면 응답에 마지막으로 추가 된 내용이 도움이 될까요? –