init.dサービスがsystemd-logicを介してマウントされるのを待つようにします。

init.dサービスがsystemd-logicを介してマウントされるのを待つようにします。

私はsystemdベースの展開(debian 10)とレガシーinit.dサービス(backuppc)を持っています。バックアップは外部ドライブに保存されるため、そのバックアップパーティションがマウントされるまでバックアップサービスが実行されないようにし、インストールが不可能な場合は一時停止し、バックアップ後に再起動するようにしたいと思います。

backuppc従来のパッケージと同様に、init.d-script を -script に移行することはsystemdオプションではなく、バックアップシステムにとって非常に重要な信頼性の問題を心配しています。

質問

  • init.dレガシーサービスをロジックのマウントに依存させる(エレガントな)方法はありますかsystemd

  • 他のサービス/ターゲットを使用して、前提条件(インストールの終了)に基づいて別のサービスを条件付きで開始/停止できますか?

  • 次の方法は信頼できますか?


現在私の考えは次のとおりです。

  1. check-mount.targetそれらの一つ

    • マウントが存在する場合、成功または失敗
    • (再)必要な場合は設置
    • バックアップサービスの前に表示されます。
    • バックアップサービスの開始
  2. stop-backup.serviceそれらの一つ

    • 活動状態の確認check-mount.target
    • マウントが有効になっていない場合は、バックアップサービスを停止します。
  3. タイマーの再起動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つのサービスを開始し、その逆もできません(ただしバックアップの停止を簡素化します)。NOTBindsTo=*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

おすすめ記事