例:

例:

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

このサービスは、前述のファイルが存在する場合にのみサービスを有効にします。

関連情報