他のデバイスが実行されている間にデバイスを停止する方法

他のデバイスが実行されている間にデバイスを停止する方法

現在、以下を使用して自動バックアップを設定しようとしています。ボグ。この目的のために、タイマーを介して起動しようとしている一回限りのシステムユーザーサービス(borgbackup.serviceと呼ばれる)を作成しました。

Borgはバックアップストレージを仮想ファイルシステムとしてマウントすることもできます。バックアップを常にマウントしたいです。私はこれのためにborgmount.serviceという別のユーザーサービスを作成しました。ただし、リポジトリのインストール中はバックアップを作成できません。

この問題に対する現在の解決策は、バックアップの前後にインストール サービスを停止して再起動する borgbackup.service の次の行で構成されています。

ExecStartPre=/usr/bin/systemctl --user stop borgmount.service
ExitStart=/bin/sh -c "borg create ::$(date) --exclude-caches --keep-tag-files"
ExecStopPost=/usr/bin/systemctl --user start borgmount.service

これは非常に見苦しく、バックアップの開始時にborgmount.serviceデバイスの状態(おそらく停止して無効になる)を考慮しません。

もっと良い方法がありますか?

ベストアンサー1

これは完璧なソリューションではありませんが、ExecStartPre使用できますConflicts

紛争=

スペースで区切られた単位名のリスト。否定的な要件依存関係を構成します。あるユニットが別のユニットに衝突=を設定した場合、前者を起動すると後者は停止し、その逆の場合も同様です。この設定は After= および Before= 順序依存関係とは無関係で直交です。

ExecStopPostこれを競合が有効になっていることを確認するコマンドと組み合わせることができます。

ExecStopPost=/usr/bin/systemctl is-enabled borgmount.service && /usr/bin/systemctl --user start borgmount.service

演算子に慣れていない場合、&&最初のコマンドが成功すると2番目のコマンドが実行されます。systemctl is-enabledデバイスがアクティブな場合は0を返します。

サービスの開始と停止に対処するユースケースはまだありませんが、より複雑またはExecStopPost決定的な状態を処理することはできますExecStartPre。残念ながら、他のデバイスが稼働している間にのみデバイスを停止するように指示したり、同様のことはありませsystemdん。Interupts


anに加えて、inをExecStartPost指定することも、単に実行する代わりにrunを実行することもできますが、これを行うには2つを同時に実行する必要があることに注意してください。Conflicts=borgmount.servicesystemctl start borgbackup.servicesystemctl start borgbackup.service borgmount.service


別のオプション(おそらく最もクリーン)は、Conflicts両方のサービスを使用し、両方のサービスを含む新しいバックアップターゲットを作成することです。

borgbackup.service必要:

Before=borgmount.serviceまず実行されていることを確認してください。

WantedBy=${NEW_TARGET}新しいターゲットを実行すると、そのターゲットが実行されていることを確認します。

borgmount.service必要:

WantedBy=${NEW_TARGET}, WantedBy1 つの単位に複数のディレクティブを指定できます。

その後、トリガーバックアップを使用できますsystemctl start ${NEW_TARGET}

この方法の利点は、borgmount.service有効になっていないと実行されないことです${NEW_TARGET}。実行せずにバックアップをトリガーしたい場合は、別々に呼び出すことができますborgmount.serviceborgbackup.service

おすすめ記事