foo
アップストリームパッケージを開始/停止するパッケージを作成していますbar
。関係は次のようになります。
- fooを起動するとbarも起動します。
- fooを停止/再ロードすると、barも停止/再ロードされます。
bar
影響を与えずに起動、停止、またはリロード可能foo
/lib/systemd/system/bar.service
次の場合:
[Unit]
Description=Bar
[Service]
ExecStart=/bin/sleep infinity
Restart=on-failure
その後、「一般的な」解決策はWantedBy
ANDPartOf
関係を追加することですbar
。
[Unit]
Description=Bar
PartOf=foo.service
[Service]
ExecStart=/bin/sleep infinity
Restart=on-failure
[Install]
WantedBy=foo.service
しかし、上流のパッケージなので、知識を強制したりパッチを適用したりするbar
のは正しいとは思いません。bar
foo
bar
完璧な解決策は、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.service
foo
bar
2番目の部分(foo
have)では、そのディレクティブを使用するのではなく、「挿入」セクションWants=bar.service
に直接追加することをお勧めします。foo.service
[Install]
bar.service
まず、この[Install]
部分はsystemctl enable bar
命令を用いて活性化しなければならないため、維持管理がやや難しい。 (また、「挿入」が尊重されないバグを発見しました[Install]
。これらのバグは修正されたと思いますが、ディストリビューションシステムにはまだ存在する可能性があります。)
また、起動しないと失敗するRequires=
ため、より強力な関係を代わりに使用することをお勧めします。Wants=
(fromなどのソート依存関係を追加することも考慮して、自己起動を実行する前に実際に動作するまで待ちます。)foo.service
bar.service
After=bar.service
foo.service
foo
bar
foo.service
これはあなたが制御するファイルなので、直接含めてください。
[Unit]
Description=Foo
Requires=bar.service
After=bar.service
順序依存性も必要であると仮定すると、そうでない場合は安全に無視できます。
これにより、すべてが解決されます。