システムタイマーで2つの「ワンショット」サービスを有効にして、順番に起動します。

システムタイマーで2つの「ワンショット」サービスを有効にして、順番に起動します。

2つのサービススナップショットがあります。

  • スナップショットを作成する
  • スナップショットを送信

2番目(送信)は常に後で実行最初の項目(作成済み)が完了しました。現在、そのタイプのサービスが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デザインによると、1つのサービスしか参照できませんTimer.Unit
  • さまざまな要件のためにデバイスが分離されました。
    • 「送信」サービスにのみネットワークが必要です。
    • 「生成」サービスもネットワークなしで実行する必要があります。
    • 要件が満たされない場合は、このサービスをスキップできます。
  • 「送信」サービスが実行されている必要があります。直後以前の「作成」サービスです。
  • タイマーが1つしかない場合:
    • スナップショット作成サービスもネットワークなしで実行する必要があるため、タイマーはトランスポートスナップショットサービスのみを有効にできません。
    • ただし、後でスナップショットトランスポートサービスを直接実行する方法がある場合、タイマーはスナップショット作成サービスのみを有効にできます。
  • 初めてスナップショットサービスを作成するのにどれくらいの時間がかかるのかわかりません。

答え1

systemd主な問題は、最初のサービスが正常に開始されるとすぐに2番目のサービスを開始する方法のようです。完了したらどうすればよいかはわかりませんが、pyznap.service実際にpyznap-send.serviceスナップショットを送信するためのネットワーク接続が不足しているため、複雑な再試行ロジックを使用する予定がないとします。

この場合、2番目のサービスを省略し、次のよう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

関連情報