サービスが無効になるとリンクが削除されるのはなぜですか? (ファイルはありません)

サービスが無効になるとリンクが削除されるのはなぜですか? (ファイルはありません)

.serviceファイルをに入れてこれを実行したいと思います/etc/systemd/system。私のソース.serviceファイルは/opt/something.service

インストールには2つのオプションがあります。

  • cp /opt/something.service /etc/systemd/system
  • ln -s /opt/something.service /etc/systemd/system

startサービスを操作するenableと、両方の方法が機能します(サービスが正常に動作します)。

ただし、サービスを無効にすると、次の違いがあります。

  • コピーの場合、/etc/systemd/system/something.serviceまだ
  • リンクの場合は/etc/systemd/system/something.service削除されます。

これは意図的に設計されていますか?リンクを介して生成されたサービスを無効にした後は、これだけでは不十分なので、これは非常に迷惑です。enableサービスユニットも再生成する必要があります。

答え1

はい、これは意図的に設計されています。

マニュアルページには次のようsystemctl disableに記載されています。

1 つ以上のデバイスを無効にします。これにより、デバイス設定ディレクトリから指定されたデバイスファイルへのすべてのシンボリックリンクが削除され、アクティブ化による変更がキャンセルされます。ただし、これは実際に生成されたシンボリックリンクのみをアクティブにするのではなく、ユニットファイルへのすべてのシンボリックリンク(つまり手動で追加されたシンボリックリンクを含む)を削除します。

これへのリンクは次のとおりです。https://www.freedesktop.org/software/systemd/man/systemctl.html#

systemctl enable理由は説明しませんが、ユニットファイルへのリンクを見つけるため、を使用して作成されたリンクと手動で生成されたリンクを区別できないと推測できます。

linksystemctlのオプションは、systemd検索パス以外のソースファイルへのシンボリックリンクを作成するときに使用する必要があります。また、同じマニュアルページから。

リンクファイル名...

ユニットファイル検索パスにないユニットファイルをユニットファイル検索パスに関連付けます。これには、ユニットファイルの絶対パスが必要です。この効果は無効にしてキャンセルできます。このコマンドの効果は、デバイスファイルがデバイス検索パスに直接インストールされるわけではありませんが、起動やその他のコマンドで使用できることです。

答え2

どのディストリビューションを使用しているのかわかりませんが、RHEL 7から始めます(これが私が使用しているディストリビューションであり、似ている必要があるためです)。

systemd/usr/lib/systemd/system/*.service通常、次のサービスファイルを探します(配布版への他のサービスリンクを確認できます)

サービスを有効にするには適切なセクションが必要です。インストール[install]セクションの内側にはタブが必要ですWantedBy=。これはWantedBy、アクティブにする必要がある条件(ランレベルなど)を指定します。WantedByのディレクトリと一致する必要があります/etc/systemd/system/*.target.wants

/etc/systemd/system/*.target.wants/その後、サービスを有効にすると、そのサービスを指すリンクが作成されます/usr/lib/systemd/system/。サービスを無効にすると、リンクも削除されます。

たとえば、次を含むサービスファイル(test.service)がある場合:

[install]
WantedBy=multi-user.target

それから:

systemctl enable test.service

内部にリンクが作成されます。

/etc/systemd/system/multi-user.target.wants/

test.serviceポインティングと呼ばれる/usr/lib/systemd/system/test.service

サービスを無効にすると、リンクのみが削除されます。

答え3

サービスへのリンクが有効になっている必要があります。フォルダの目的はスクリプトを保存するのではなく、サービスを無効または有効にすることであるため、実際のファイルを持つことは悪い習慣です。

答え4

1つの回避策は、シンボリックリンクされたディレクトリを削除しないsystemdを使用することです。

システムリンクの場合:/usr/local/lib/systemd/system/

ユーザーリンクの場合: ~/.config/systemd/user.controlまたは/usr/local/lib/systemd/user/

シンボリックリンクを上記のディレクトリに配置します。systemctl disable以下はsystemctl enable期待どおりに機能します。

関連情報