システム化された「ConsistsOf」関係を定義する方法

システム化された「ConsistsOf」関係を定義する方法

fooアップストリームパッケージを開始/停止するパッケージを作成していますbar。関係は次のようになります。

  • fooを起動するとbarも起動します。
  • fooを停止/再ロードすると、barも停止/再ロードされます。
  • bar影響を与えずに起動、停止、またはリロード可能foo

/lib/systemd/system/bar.service次の場合:

[Unit]
Description=Bar

[Service]
ExecStart=/bin/sleep infinity
Restart=on-failure

その後、「一般的な」解決策はWantedByANDPartOf関係を追加することですbar

[Unit]
Description=Bar
PartOf=foo.service

[Service]
ExecStart=/bin/sleep infinity
Restart=on-failure

[Install]
WantedBy=foo.service

しかし、上流のパッケージなので、知識を強制したりパッチを適用したりするbarのは正しいとは思いません。barfoobar

完璧な解決策は、foo.service次のようにすることです。

[Unit]
Description=Foo
Wants=bar.service
ConsistsOf=bar.service

[Service]
Type=oneshot
ExecStart=/bin/true
RemainAfterExit=yes

しかし、私のJournalctlは次のように言います。

'Unit'セクションの不明なlvalue 'ConsistsOf'

そしてマニュアルページ説明する:

a.serviceでPartOf = b.serviceを使用している場合、この依存関係はb.serviceのプロパティリストにConsistsOf = a.serviceとして表示されます。ConsistsOf=依存関係を直接指定することはできません。

全然知らないなぜ ConsistsOf=直接指定することはできませんが、私が考慮していない選択肢はありますか?

ベストアンサー1

他のデバイスとの関係を含むようにアップストリーム/外部bar.serviceを変更する適切な方法PartOf=は、元のファイルに触れることなく既存のデバイスを変更できるシステム機能である「直接」オーバーライド構成を使用することです。

~からシステム装置マニュアルページ:

ユニットファイルに加えて、foo.service「挿入」ディレクトリがあるかもしれません。このディレクトリでは、サフィックス ""が付いたfoo.service.d/すべてのファイルは、.confユニットファイル自体が解析された後に解析されます。これは、ユニットファイルを変更せずにユニットの構成設定を変更または追加するのに役立ちます。

/etc/systemd/system/bar.service.d/partof-foo.conf場合によっては、次の内容を含むインサートを作成する必要があります。

[Unit]
PartOf=foo.service

(名前はpartof-foo.conf単なる提案であり、.conf接尾辞を持つすべての名前が機能します。)

次にreloadデーモンを使用してくださいsystemctl daemon-reload

完了すると、検査装置を使用することができ、systemctl cat barこれは適用範囲が考慮されていることを明確に示す。また、現在の関係がsystemctl show foo表示され、その関係の効果に従います。 (停止すると停止が発生します。)ConsistsOf=bar.servicefoobar

2番目の部分(foohave)では、そのディレクティブを使用するのではなく、「挿入」セクションWants=bar.serviceに直接追加することをお勧めします。foo.service[Install]bar.service

まず、この[Install]部分はsystemctl enable bar命令を用いて活性化しなければならないため、維持管理がやや難しい。 (また、「挿入」が尊重されないバグを発見しました[Install]。これらのバグは修正されたと思いますが、ディストリビューションシステムにはまだ存在する可能性があります。)

また、起動しないと失敗するRequires=ため、より強力な関係を代わりに使用することをお勧めします。Wants=(fromなどのソート依存関係を追加することも考慮して、自己起動を実行する前に実際に動作するまで待ちます。)foo.servicebar.serviceAfter=bar.servicefoo.servicefoobar

foo.serviceこれはあなたが制御するファイルなので、直接含めてください。

[Unit]
Description=Foo
Requires=bar.service
After=bar.service

順序依存性も必要であると仮定すると、そうでない場合は安全に無視できます。

これにより、すべてが解決されます。

おすすめ記事