추상적인 예:
서비스 로 설정하려는 A
두 가지 반복 작업이 있습니다 . 작업은 서로 매우 유사하므로 템플릿을 사용합니다 . A와 B 는 각각 이 템플릿의 인스턴스로 실행됩니다 .B
systemd
[email protected]
[email protected]
[email protected]
# [email protected]
[Unit]
Description= myservice %I
[Service]
Type=oneshot
IOSchedulingClass=idle
ExecStart=bash -c "echo Starting %I; sleep 10; echo Finished %I"
Restart=on-failure
이 두 작업에 대한 반복 요구 사항은 myservice-A.timer
두 개의 타이머와 로 처리되어야 합니다 myservice-B.timer
. 타이머는 A
매주 및 B
매일 과 같이 구성된 간격에 따라 두 작업이 반복되도록 합니다 . 타이머는 PC가 꺼져 있는 경우에도 이를 보장하며, 사전 구성된 재시작 시간이 초과되면 가능한 한 빨리 서비스를 시작합니다.
A
그러나 이 마지막 경우는 완료해야 하는 이전 요구 사항과 충돌할 수 있습니다 B
(두 가지가 동시에 시작된 경우). 템플릿 인스턴스를 사용하고 있으므로 Before=
서비스 자체에서 및 옵션을 사용할 수 없습니다. After=
타이머에 추가할 수 있지만 문제가 해결되지 않는 것 같습니다(아마도 이제 타이머는 시작하는 서비스가 아닌 정렬 종속성만 가져오기 때문일 것입니다).
# myservice-A.timer
[Unit]
# The Before= requirement below does not help
Before=myservice-B.timer
Description=weekly execution of myservice
[Timer]
OnCalendar=Monday *-*-* 09:20:00
Persistent=true
[email protected]
[Install]
WantedBy=timers.target
# myservice-B.timer
[Unit]
# the After= requirement below does not help
After=myservice-A.timer
Description=daily execution of myservice
[Timer]
OnCalendar=09:30:00
Persistent=true
[email protected]
[Install]
WantedBy=timers.target
B
실행이 필요하지 않습니다 . 즉 A
, 해당 유형의 종속성을 찾고 있지 않습니다 Requires=
. 나는 와 둘 다 타이머를 A
통해 시작되고 시작하기 전에 완료 되어야 하는 경우에 대해서만 논의하고 있습니다 .B
A
B
답변1
템플릿 인스턴스를 사용하고 있으므로
Before=
서비스 자체의 및 옵션을 사용할 수 없습니다.After=
그러나 템플릿의 특정 인스턴스에 대해 이를 설정할 수 있습니다. 그러나 어떤 관계가 원만하게 이루어지기 위해서는알아채다:
가장 중요한 점은 서비스 단위의 경우
Before=
구성된After=
모든 시작 명령이 호출되고 해당 명령이 실패하거나 성공적인 시작을 보고하면 시작이 완료된 것으로 간주된다는 것입니다.
즉, 주문이 완료 [email protected]
되면ExecStart
시작구현하다. 완료될 때까지 기다리지 않습니다. 그러나 ExecStartPre
명령에서 이러한 단위의 실제 작업을 수행하고 간단한 /bin/true
for 를 사용하면 ExecStart
정렬이 작동합니다. 어쩌면 다음과 같은 것일 수도 있습니다.
# [email protected]
[Unit]
Description= myservice %I
[email protected] # Will be skipped for `myservice@A` itself
[Service]
Type=oneshot
IOSchedulingClass=idle
ExecStartPre=/bin/bash -c "echo Starting %I; sleep 10; echo Finished %I"
ExecStart=/bin/true
Restart=on-failure
명령을 실행하는 데 시간이 오래 걸리는 경우 세트를 구성해야 할 수도 있습니다.TimeoutStartSec
그러므로.