initスクリプトをsystemdに書き直そうとしていますが、オプションの依存関係に問題があります。
私のサービス(オプション)は2つの異なるサービスによって異なります。これら2つの依存関係は相互に排他的です(サーバーパッケージとクライアントパッケージ)。一度に1つだけインストールでき、完全に欠落している可能性があります。
依存関係がインストールされている場合、その依存関係はサービスの前に開始する必要があり、起動に失敗した場合はサービスを開始しないでください。
ただし、両方の依存関係がインストールされていない場合、サービスは正常に開始されます。
この機能をどのように実装できますか?オプションの依存関係はを通じて処理されますが、Wants=
エラーは無視されます。
答え1
依存関係を制御できる場合(つまり、ソフトウェアの場合)、関連ユニットファイルの組み込みファイルをインストールしてください。つまり、foo.service
依存関係が必要なものがあるとしますbar.service || baz.service
。
これにより、パッケージは以下を含むbar
ファイルをインストールできます。/usr/lib/systemd/system/foo.service.d/50-bar-baz.conf
[Unit]
Requires=bar.service
バッグも同じだbaz
。
依存関係を制御できない場合は、ユニットファイルが存在することを確認してから、選択したexec systemctl start
ユニットファイルに対して操作を実行する「ディスパッチャ」スクリプトを作成します。次に、別々の単位を作成し、基本単位の後にrequire /を追加します。
[Unit]
# inexistent unit names are ignored here
After=bar.service baz.service
[Service]
Type=oneshot
ExecStart=/path/to/dispatcher
答え2
システムパス単位を使用できます。パス/ファイルが存在することを確認するには、サービスファイルに対応するパス単位が必要です。
例:
service.path
[Unit]
Description:Service description
[Path]
PathExists=!/other/service/binary/path/or/some/other/file/from/that/package
[Install]
WantedBy=some-user.target
このサービスは、前述のファイルが存在する場合にのみサービスを有効にします。