두 개의 서비스 스냅샷이 있습니다.
- 스냅샷을 생성하는 것
- 스냅샷 보내기
두 번째 (보내기)는항상 이후에 실행첫 번째 항목(생성됨)이 완료되었습니다. 현재 해당 유형의 서비스가 oneshot
동시에 실행되고 있습니다.
서비스는 다음과 같이 정의됩니다(다음 예에 사용된 정확한 명령은 이 질문에 중요하지 않으며 자세한 요구 사항은 예 아래에 제공됩니다).
- 스냅샷을 생성하는 서비스(
pyznap.service
):[Unit] Description=Create ZFS snapshots Documentation=man:pyznap(1) Requires=local-fs.target After=local-fs.target [Service] Type=oneshot ExecStart=/usr/bin/pyznap snap
- 스냅샷을 보내는 서비스(
pyznap-send.service
):[Unit] Description=Send ZFS snapshots Documentation=man:pyznap(1) Requires=local-fs.target network-online.target After=local-fs.target network-online.target pyznap.service [Service] Type=oneshot ExecStart=/usr/bin/pyznap send
현재는 별도의(그리고 독립적인) 타이머에 의해 트리거됩니다.
- 스냅샷 생성 타이머(
pyznap.timer
):[Unit] Description=Run pyznap snap every 15 minutes [Timer] OnCalendar=*:0/15 Persistent=true [Install] WantedBy=timers.target
- 스냅샷 전송 타이머(
pyznap-send.timer
):[Unit] Description=Run pyznap send every 15 minutes [Timer] OnCalendar=*:0/15 Persistent=true [Install] WantedBy=timers.target
추가 참고 사항:
- 질문에는 다음이 포함됩니다."타이머를 사용하도록 여러 시스템 서비스를 구성하는 방법은 무엇입니까?하지만 이 솔루션은 여전히 서비스를 동시에 실행합니다.
systemd
디자인 에 따르면, 하나의 서비스만 참조할 수 있습니다Timer.Unit
.- 다양한 요구 사항으로 인해 장치가 분리되었습니다.
- "보내기" 서비스에만 네트워크가 필요합니다.
- "생성" 서비스도 네트워크 없이 실행되어야 합니다.
- 요구 사항이 충족되지 않으면 이 서비스를 건너뛸 수 있습니다.
- "보내기" 서비스가 실행 중이어야 합니다.직후이전의 "만들기" 서비스입니다.
- 타이머가 하나만 있는 경우:
- 스냅샷 생성 서비스도 네트워크 없이 실행되어야 하므로 타이머는 전송 스냅샷 서비스만 활성화할 수 없습니다.
- 하지만 이후에 스냅샷 전송 서비스를 직접 실행할 수 있는 방법이 있는 경우 타이머는 스냅샷 생성 서비스만 활성화할 수 있습니다.
- 처음으로 스냅샷 서비스를 생성하는 데 시간이 얼마나 걸릴지 알 수 없습니다.
답변1
systemd
주요 문제 는 첫 번째 서비스가 성공적으로 시작되자마자 두 번째 서비스를 시작하는 방법인 것 같습니다 . 완료되는 경우 어떻게 해야 하는지는 알려주지 않지만 pyznap.service
실제로 pyznap-send.service
스냅샷을 보내기 위한 네트워크 연결이 부족하므로 복잡한 재시도 논리를 사용할 계획이 없다고 가정합니다.
이 경우 두 번째 서비스를 생략하고 다음 ExecStartPost
과 같이 호출되는 서비스에 줄을 추가하는 것을 고려할 수 있습니다.pyznap.service
pyznap
send
ExecStartPost=/usr/bin/pyznap send
또는systemd
, 기능을 더 많이 제어하려면 기능을 정의할 수 있지만 pyznap-send.service
다음 명령문을 통해 활성화할 수 있습니다.pyznap.service
ExecStartPost
ExecStartPost=/usr/sbin/systemctl start pyznap-send.service
이 경우 시작 라인이 호출될 때 "시작됨"으로 등록되지 않았을 수 있으므로 파일 After=pyznap.service
에서 해당 명령문을 제거해야 합니다.pyznap-send.service
pyznap.service
ExecStartPost
pyznap-send.service