現在、以下を使用して自動バックアップを設定しようとしています。ボグ。この目的のために、タイマーを介して起動しようとしている一回限りのシステムユーザーサービス(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.service
systemctl start borgbackup.service
systemctl start borgbackup.service borgmount.service
別のオプション(おそらく最もクリーン)は、Conflicts
両方のサービスを使用し、両方のサービスを含む新しいバックアップターゲットを作成することです。
borgbackup.service
必要:
Before=borgmount.service
まず実行されていることを確認してください。
WantedBy=${NEW_TARGET}
新しいターゲットを実行すると、そのターゲットが実行されていることを確認します。
borgmount.service
必要:
WantedBy=${NEW_TARGET}
, WantedBy
1 つの単位に複数のディレクティブを指定できます。
その後、トリガーバックアップを使用できますsystemctl start ${NEW_TARGET}
。
この方法の利点は、borgmount.service
有効になっていないと実行されないことです${NEW_TARGET}
。実行せずにバックアップをトリガーしたい場合は、別々に呼び出すことができますborgmount.service
。borgbackup.service