systemd 템플릿 인스턴스 간의 순서 종속성 관리

systemd 템플릿 인스턴스 간의 순서 종속성 관리

추상적인 예:

서비스 로 설정하려는 A두 가지 반복 작업이 있습니다 . 작업은 서로 매우 유사하므로 템플릿을 사용합니다 . A와 B 는 각각 이 템플릿의 인스턴스로 실행됩니다 .Bsystemd[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통해 시작되고 시작하기 전에 완료 되어야 하는 경우에 대해서만 논의하고 있습니다 .BAB

답변1

템플릿 인스턴스를 사용하고 있으므로 Before=서비스 자체의 및 옵션을 사용할 수 없습니다.After=

그러나 템플릿의 특정 인스턴스에 대해 이를 설정할 수 있습니다. 그러나 어떤 관계가 원만하게 이루어지기 위해서는알아채다:

가장 중요한 점은 서비스 단위의 경우 Before=구성된 After=모든 시작 명령이 호출되고 해당 명령이 실패하거나 성공적인 시작을 보고하면 시작이 완료된 것으로 간주된다는 것입니다.

즉, 주문이 완료 [email protected]되면ExecStart시작구현하다. 완료될 때까지 기다리지 않습니다. 그러나 ExecStartPre명령에서 이러한 단위의 실제 작업을 수행하고 간단한 /bin/truefor 를 사용하면 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그러므로.

관련 정보