여러 호스트 이름 패턴을 기반으로 조건부로 시스템 서비스를 시작하려고 합니다.
나는 이것을 시도했지만 운이 없었습니다.
root@linkbox-BI034415:/# systemctl cat mcbapp
# /lib/systemd/system/myservice.service
[Unit]
Description=My Service
Wants=another.service
After=another.service
ConditionHost=HostOne*|HostTwo*
Also tried
ConditionHost={HostOne*,HostTwo*}
[Service]
EnvironmentFile=/etc/default/myenv
ExecStart=/opt/bin/my-apps
Restart=on-failure
[Install]
WantedBy=multi-user.target
어떤 제안이 있으십니까?
답변1
간단히 말해서:
ConditionHost=|HostOne*
ConditionHost=|HostTwo*
쉽게 를 사용하여 조건을 확인할 수 있습니다 systemd-analyze
. 이렇게 하면 테스트 속도가 빨라집니다.
ConditionHost
다음은 내 컴퓨터( )에서 사용하는 예입니다 stewbian
.
여기서는 정확히 일치하는 항목을 성공적으로 얻었습니다.
$ systemd-analyze condition ConditionHost=stewbian
test.service: ConditionHost=stewbian succeeded.
Conditions succeeded
여기서 글로벌 매치를 성공적으로 마쳤습니다
$ systemd-analyze condition ConditionHost=stew*
test.service: ConditionHost=stew* succeeded.
Conditions succeeded.
여기서는 일치 항목이 올바르지 않기 때문에 올바르게 실패했습니다.
$ systemd-analyze condition ConditionHost=machine2
test.service: ConditionHost=machine2
따라서 우선 귀하의 테스트가 에서 작동한다고 말할 수 있지만 ConditionHost=Host*
더 정확하기를 원하는 것 같습니다.
~에서man systemd.unit
:
여러 조건이 지정된 경우 모든 조건이 적용되면(즉, 논리 AND가 적용됨) 단위가 실행됩니다.
따라서 여러 조건은 별도의 줄에 있어야 하지만 AND로 연결되어 실패합니다.
$ systemd-analyze condition "ConditionHost=machine2" "ConditionHost=stewbian"
test.service: ConditionHost=stewbian succeeded.
test.service: ConditionHost=machine2 failed.
Conditions failed.
그러나 매뉴얼 페이지는 계속됩니다.
조건 확인에서는 조건을 트리거 조건으로 만드는 등호("Condition...=|...") 뒤에 세로 막대 기호("|")를 사용할 수 있습니다. 장치에 대해 하나 이상의 트리거 조건이 정의된 경우 해당 장치에 대해 하나 이상의 트리거 조건이 적용되고 모든 일반(즉, 트리거되지 않는) 조건이 적용되면 장치가 시작됩니다.
따라서 ConditionHost=|
각 조건을 사용하면 조건이 OR로 연결됩니다.
$ systemd-analyze condition "ConditionHost=|machine2" "ConditionHost=|stewbian"
test.service: ConditionHost=|stewbian succeeded.
test.service: ConditionHost=|machine2 failed.
Conditions succeeded.
다음과 같이 글로브를 포함할 수도 있습니다.
$ systemd-analyze condition \
"ConditionHost=|stew*" \
"ConditionHost=|machine*"
test.service: ConditionHost=|machine* failed.
test.service: ConditionHost=|stew* succeeded.
Conditions succeeded.
파일에서 다음을 사용하십시오.
ConditionHost=|HostOne*
ConditionHost=|HostTwo*
나는 당신이 무엇을 하고 싶은지 알 수 있습니다. 이것문서 설명하다:
이는 호스트 이름 문자열(선택적으로 쉘 스타일 글로브 사용) 이것은 로컬로 설정된 호스트 이름에 대해 테스트되었습니다...
우리가 보면man 7 glob
우리는 읽고:
문자열에 "?", "*" 또는 "[" 문자 중 하나가 포함되어 있으면 와일드카드 패턴입니다. 와일드카드 지정은 와일드카드 패턴을 패턴과 일치하는 경로 이름 목록으로 확장하는 작업입니다.
이 정의에서는 및 둘 다 전역으로 간주 |
되지 않습니다 {...}
. systemd는 {...}
일반적인 bash
glob으로 간주될 수 있지만 bash가 아니며 해당 정의를 사용하지 않습니다.