2016-09-27 3 views
0

systemd - restart를 사용하여 여러 프로세스를 시작하려고 시도했습니다. 유일한 차이점은 프로세스의 논증입니다.systemd : 동일한 단위의 복수 단위

프로세스 당 단위 파일을 피할 방법이 있습니까? 모든 프로세스의 단위 파일을 함께 찾고 있습니다.

일반적으로 나는 시작 스크립트를 사용 하겠지만, 말했듯이 종료시 재시작해야합니다. 그리고 나는 순수한 systemd와 handmade skriptlets로 그것을하는 방법을 보지 못합니다.

감사합니다.

답변

1

아마도 템플릿 단위를 사용하면 필요에 맞을 것입니다. 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으로 바꿉니다. 그 대안을 찾는 것이 더 나을 것이라고 생각합니다. 그러나 유스 케이스에 대해 더 많이 알지 못하면 그 해결책이 무엇인지 확신 할 수 없습니다.

+0

완벽! 고맙습니다! – chris01

+0

질문 하나만 더하십시오 : 1 개 이상의 인수를 전달하는 방법은 무엇입니까? 시도해 보았습니다 = myservice @ "a 1".service 하지만 작동하지 않습니다 – chris01

+1

@chris 어쩌면 응답에 마지막으로 추가 된 내용이 도움이 될까요? –