시스템 타이머에서 두 개의 "원샷" 서비스를 활성화하여 차례로 시작합니다.

시스템 타이머에서 두 개의 "원샷" 서비스를 활성화하여 차례로 시작합니다.

두 개의 서비스 스냅샷이 있습니다.

  • 스냅샷을 생성하는 것
  • 스냅샷 보내기

두 번째 (보내기)는항상 이후에 실행첫 번째 항목(생성됨)이 완료되었습니다. 현재 해당 유형의 서비스가 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.servicepyznapsend

ExecStartPost=/usr/bin/pyznap send

또는systemd, 기능을 더 많이 제어하려면 기능을 정의할 수 있지만 pyznap-send.service다음 명령문을 통해 활성화할 수 있습니다.pyznap.serviceExecStartPost

ExecStartPost=/usr/sbin/systemctl start pyznap-send.service

이 경우 시작 라인이 호출될 때 "시작됨"으로 등록되지 않았을 수 있으므로 파일 After=pyznap.service에서 해당 명령문을 제거해야 합니다.pyznap-send.servicepyznap.serviceExecStartPostpyznap-send.service

관련 정보