
나는 템플릿화된 서비스 세트를 실행하기 위해 일부 템플릿화된 타이머 장치를 사용하고 있습니다. 백업 리포지토리에 대한 단독 잠금이 필요하고 백업 작업과 동시에 실행할 수 없는 백업 작업 및 관련 유지 관리 작업이 있습니다. 작업 순서가 올바르게 지정되도록 장치를 설정하는 방법을 알아내려고 노력 중입니다.
예를 들어 다음과 같은 서비스 템플릿이 있습니다.
다음과 같은 타이머 템플릿이 있습니다.
[email protected]
유닛이 해당 인스턴스를 시작하는 위치 [email protected]
는 다음과 같습니다.
[Unit]
Description=daily backup of %i
[Timer]
OnCalendar=daily
Unit=backup@%i.service
[Install]
WantedBy=timers.target
내가 달리면...
systemctl enable --now [email protected] [email protected]
...backup@foo 서비스가 완료될 때까지 clean@foo 서비스가 실행되지 않도록 해야 합니다.
지금까지 제가 생각해낸 유일한 해결책은 OnCalendar=daily
백업 작업을 보장할 수 있도록 삭제하고 대신 명시적인 시작 시간을 사용하는 것입니다.시작먼저(예: 오전 1시에 백업 작업 시작, 오전 2시에 유지 관리 작업 시작) 그런 다음 일종의 잠금(예: flock
) 명령을 활용하여 백업 작업이 완료될 때까지 유지 관리 작업이 시작되지 않도록 합니다.
작동하지만 약간 해킹됩니다. systemd를 사용하여 이 문제를 해결하는 더 좋은 방법이 있다면 그 방법을 찾아보고 싶습니다.
답변1
이 질문을 조금 곰곰이 생각해보면 분명한 답이 있습니다. 템플릿에서 다음과 같이 [email protected]
해당 인스턴스에 대한 종속성을 추가합니다 [email protected]
.
[Unit]
After=backup@%i.service
서비스가 병렬로 시작되는 한 이는 잘 작동합니다. 동일한 OnCalendar
설정을 가진 서비스가 병렬로 시작되는지 지금은 알 수 없습니다 . 해당 답변을 알아낸 후 이 답변을 업데이트하겠습니다.
답변2
나는 직장 에 직업을 Requires
두어 비슷한 문제를 해결했습니다 . 내 타이머는 6시간마다 작업을 실행합니다. 종속성으로 인해 작업이 시작되고 , 백업이 완료되면 60일이 넘은 모든 스냅샷이 정리됩니다. 그런데 두 서비스 모두 .backup
clean
clean
clean
backup
Type=oneshot
또한 비슷한 방식으로 작동하는 단일 백업 및 정리 작업을 고려했습니다.
단점은 백업을 시작하지 않으면 클린 작업을 실행할 수 없다는 것입니다. 하지만 이는 실제 문제는 아닙니다.