Systemdで「リンク」ユニットファイルを有効にする

Systemdで「リンク」ユニットファイルを有効にする

私はまだsystemdを理解しており、いくつかの問題に直面しています。あまり大したことではありませんが、何が起こっているのかをもっと知りたいです。他の場所ではこれに対する言及が見つかりません。

まず、サービス用のカスタム単位ファイルを配置する必要があることを知っています/etc/systemd/system。ただし、ユニットファイルが別の場所に配置できる場合は、サーバーの管理に最適です。

ドキュメントを見ると、次のようにユニットファイルを「リンク」できることがわかります。

systemctl link /path/to/servicename.service

これにより、上記のコンテンツへのリンクが作成されます/etc/systemd/system。これでサービスを開始/停止できます。表面的に、これは私たちがサービスを管理する良い方法のようです。

ただし、これらの「リンクされた」ユニットファイルをアクティブにしようとすると失敗します。

root@test1:/etc/systemd/system# systemctl link /root/myservice.service 
Created symlink from /etc/systemd/system/myservice.service to /root/myservice.service.

root@test1:/etc/systemd/system# systemctl status myservice.service 
 * myservice.service - My Test Service
     Loaded: loaded (/root/myservice.service; linked; vendor preset: enabled)

root@test1:/etc/systemd/system# systemctl enable myservice.service
Failed to execute operation: No such file or directory

まったく同じユニットファイルを使用しますが、/etc/systemd/systemリンクの代わりにコピーすると、次のような結果が得られます。

root@test1:/etc/systemd/system# cp -p /root/myservice.service .

root@test1:/etc/systemd/system# systemctl daemon-reload 

root@test1:/etc/systemd/system# systemctl status myservice.service 
 * myservice.service - My Test Service
     Loaded: loaded (/etc/systemd/system/myservice.service; disabled; vendor preset: enabled)

root@test1:/etc/systemd/system# systemctl enable myservice.service
Created symlink from /etc/systemd/system/multi-user.target.wants/myservice.service to /etc/systemd/system/myservice.service.

これにより、システム起動時にリンクされたユニットファイルを呼び出すことができないように見えます。

それでは、「リンク」機能のポイントは何ですか?文書によると、

リンクファイル名

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

答え1

マニュアルページが誤解を招くおそれがあります。

systemctl link /root/myservice.service

systemctl enable /root/myservice.service

最初はあなたがそれをすることを可能にしますsystemctl start myservice。 2番目はmyservice自動起動を可能にします(@ Julienが指摘したように自動的に追加されますlink)。

私の考えでは…私は一日中これについて考えようとしました。

答え2

デフォルトパスではなくパスでサービスを有効にする場合は、フルパスを使用する必要があります。有効にすると、次のリンクも作成されます。

systemctl enable /root/myservice.service

有効にすると、サービス名を使用して開始/停止/状態を設定できます。

systemctl start myservice

以下はいくつかの考慮事項です。

関連情報