私はまだ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
以下はいくつかの考慮事項です。
- すでにリンクされているサービスファイルをアクティブにすることはできません。
- パスが同じマウントされたディスクにあることを確認してください。そうしないと、ディスクがまだマウントされておらず、ファイルが見つからないため、systemdは起動時にサービス単位ファイルをロードできません。 (望むよりインストールされているディスクのシステムリンクユニットファイルをロードできません。)
- systemdのバグのため、非標準パスのユニットファイルでインスタンスを有効にできません(参照:https://github.com/systemd/systemd/issues/661)