シンボリックリンクをシステムサービスとして使用できますか?

シンボリックリンクをシステムサービスとして使用できますか?

mysshd.serviceたとえば、ディレクトリの下にサービスという名前があります/usr/lib/systemd/system/。次のシンボリックリンクを作成できます。

ln -s /usr/lib/systemd/system/mysshd.service /usr/lib/systemd/system/fool.service

それでは、私がfool.serviceをするすべての行為がmysshd.servicesystemctl enable/disable start/stop fool.servce)に反映されるのでしょうか?

私の意図は、私のSSHDサービスへのシンボリックリンクを介してネイティブSSHDサービスをオーバーライドすることです。

答え1

link絶対パスで使用:

systemctl link /home/nick/myservice.service

すでにリンクされているファイルにはリンクできません。

答え2

私が知る限り、systemdはこれをうまく処理しません。私が理解したところによると、あなたはその行動を無視したいと思いますsshd.service。そうですか?

幸いなことに、systemdはこの種の作業のために設計されています。サービス定義をに入れて/etc/systemd/system/ssh.service実行してsystemctl daemon-reloadユニットファイルを再ロードすると、systemdは自動的にsystemの代わりにその設定を使用しますssh.service

あなたもsystemctl enable mysshd.service就職したいですか?大丈夫です。[Install]ユニットファイルセクションに次の行を追加してsystemdにユニットシンボリックリンクを変更するように指示するAlias=mysshd.serviceと、systemctl reenable ssh.service完了します。

mysshd.service今何をすべきかを詳しく説明していません。いつもと全く違うならssh.service本当にいいと思います!上記の方法を使用してください。しかし、非常に小さなものを1つだけ変更したい場合は、間違ったアプローチを使用しています。 systemdを使用すると、ユニットファイルの「フラグメント」を作成し、それを通常のユニットファイルの上に適用できます。これにより、個々のディレクティブを追加またはオーバーライドし、残りのユニットファイルがパッケージマネージャから更新を受け取ることができます。これを行うには、作成するだけです。必要に応じて/etc/systemd/system/ssh.d/my-custom-config.conf変更でき、複数のオーバーレイファイルを持つこともできます。my-custom-config.confそのファイルで変更または追加したいものを共通ssh.service。作業が終わったら、必ず行う必要があります(使用する場合は、)。Alias=systemctl start mysshd.servicesystemctl daemon-reloadAlias=systemctl reenable ssh.service

さて、絶対に、一度/usr/lib/systemdシステム単位のファイルを変更してみてください!ファイルシステム階層標準必要/usr読み取り専用として扱われます。実際には、パッケージマネージャが処理し/usr(除く/usr/local)、パッケージマネージャが処理するものは、ユーザーが触れないことを意味します。特に変更が最終的に上書きされる可能性があるためです。代わりに、同様の場所に物を置きます/etc

答え3

シンボリックリンク以前は不可能。でも今日はそう始まるんですね。

答え4

他の人がこの質問に答えましたが、ユーザーのホームディレクトリにあるユニットへのシンボリックリンクを作成できないことを指摘した人はいません。彼らはそれの外に住むべきです。 rootが所有し、644権限で構成されていても機能しません。 /homeの外側にある必要があります。

@evandrixは--userフラグを使用できると指摘しました。そのプロセスはそれよりも複雑です。 「--user」は、ユーザーディレクトリで有効になっているシステムデバイスにのみ適用できます。これにより、ユーザーは --system ドメイン外で自分のサービスを制御できます。特定のバージョンのsystemd(2.37以降を除いて、どのバージョンが私に役立つのか忘れました)だけが--userドメインを使用します。この記事を読むことをお勧めします。

https://nts.strzibny.name/systemd-user-services/

さらに、このアーチページは素晴らしい情報を提供します:

https://wiki.archlinux.org/title/systemd/User

これを行う方法の簡単な分析:

  1. ユーザーアカウントにはパスワードが必要です。アカウントにパスワードがないと機能しません。
  2. ps -aux | grep systemd特定のユーザーに対して「/usr/lib/systemd/systemd --user」と表示する必要があります。このサービスは、ユーザーが初めてログインしたときにpam.dによって開始されます。
  3. /home/YourUserName/.config/systemd/user/ ディレクトリが存在しますか?もしそうなら、ユニットファイルをそこに入れてください。作成されない場合は、ユニットをそこに置きます。
  4. ログアウトしてから上記のディレクトリにデバイスを移動し、もう一度ログインしてください。
  5. このコマンドを実行
$ systemctl --user enable myuser.service
$ systemctl --user daemon-reload

これで、すべてのsystemctlコマンドをuserとして実行できるようになりますが、--userフラグを含める必要があります。

$ systemctl --user status myuser.service
$ systemctl --user start myuser.service
$ systemctl --user restart myuser.service
$ systemctl --user stop myuser.service

デバイスの[サービス]セクションで、[ユーザー]と[グループ]の設定を適切に設定する必要があります。また、--userを使用している場合はsystemctl link myuser.serviceシステムドメインでのみ機能するため、使用しないでください。ユーザーのシンボリックリンクは実行時に構築され、次にリンクさsystemctl --user enable myuser.serviceれます。/home/YourUserName/.config/systemd/user/multi-user.target.wants/

関連情報