私はsystemd
ベースの展開(debian 10
)とレガシーinit.d
サービス(backuppc
)を持っています。バックアップは外部ドライブに保存されるため、そのバックアップパーティションがマウントされるまでバックアップサービスが実行されないようにし、インストールが不可能な場合は一時停止し、バックアップ後に再起動するようにしたいと思います。
backuppc
従来のパッケージと同様に、init.d
-script を -script に移行することはsystemd
オプションではなく、バックアップシステムにとって非常に重要な信頼性の問題を心配しています。
質問
init.d
レガシーサービスをロジックのマウントに依存させる(エレガントな)方法はありますかsystemd
?他のサービス/ターゲットを使用して、前提条件(インストールの終了)に基づいて別のサービスを条件付きで開始/停止できますか?
次の方法は信頼できますか?
現在私の考えは次のとおりです。
check-mount.target
それらの一つ- マウントが存在する場合、成功または失敗
- (再)必要な場合は設置
- バックアップサービスの前に表示されます。
- バックアップサービスの開始
stop-backup.service
それらの一つ- 活動状態の確認
check-mount.target
- マウントが有効になっていない場合は、バックアップサービスを停止します。
- 活動状態の確認
タイマーの再起動
check-mount.target
次のようになります。
#check-mount.target
[Unit]
Description="starts backuppc if mount is present, fails otherwise"
BindsTo=backup_data.mount
After=backup_data.mount
Before=backuppc.service
Wants=backuppc.service
[Install]
WantedBy=default.target
#stop-backup.service
[Unit]
Description="stops backup if mount is NOT present"
[Service]
#stop backup service if check-mount.target failed/is not active
ExecCondition=/usr/bin/bash -c '! /usr/bin/systemctl is-active --quiet backup_data.mount'
ExecStart=/usr/bin/systemctl stop backuppc
#restart will fail as long as mount is present:
Restart=on-failure
RestartSec=2
[Install]
WantedBy=default.target
#timer for check-mount.target
OnUnitInactiveSec=10
Unit=check-mount.target
[Install]
WantedBy=default.target
この結果/その他の結果で気に入らない点:
- 2つのサービスと1つのタイマーが必要で、そのうちの1つは継続的に再起動されます。 =>お互いをトリガーする単純な依存関係を好む。
Conflicts=backuppc
-testが実行される前に競合が発生するため、inは使用stop-backup.service
できませんExecCondition
。つまり、バックアップサービスは常に停止します。- AFAIKにはロジックはあり
systemd
ません。つまり、他のサービスが失敗すると、1つのサービスを開始し、その逆もできません(ただしバックアップの停止を簡素化します)。NOT
BindsTo=*NOT*backup_data.mount
ベストアンサー1
私はinit.d起動スクリプト関数を呼び出すシステムサービスファイルを書くのがとても簡単でなければならないと思います。
* ExecStart= -> start function
* ExecStop= -> stop function
* ...
これにより、After =、Wants =、またはRequire =などのシステム固有のディレクティブに頼ることが容易になります。
この質問は、 init.d ブロックを空の systemd サービスファイルに含めて、systemd が魔法のように正しい操作を実行できるようにする方法も示しています。https://serverfault.com/questions/690155/whats-the-easiest-way-to-make-my-old-init-script-work-in-systemd