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


14

たとえば、ディレクトリの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
サービスを追加して有効にし、ネイティブsshdサービスを無効にしてみませんか?
ランバート

私のソフトウェアは、シンボリックリンク/etc/init.d/ssh-> /etc/init.d/mysshを使用した以前のバージョンと互換性があります。
ニック

私はまだあなたの意味を正確には理解していませんが、あなたの行によれば<quote>私がfool.serviceで行う操作はすべてmysshd.serviceに反映されます(systemctl enable / disable start / stop fool.servce)?</ quote > sshdの後にサービスを開始/有効化するためのsystemdの依存関係(wiki.archlinux.org/index.php/systemd#Handling_dependenciesを参照)をご覧ください。
ランバート

Stack Exchangeへの@nickの歓迎!Stack Exchangeでは、投票により回答に対する賞賛を示すのが慣例となっています。回答の左側にある上矢印をクリックして、これを行うことができます。私の回答で問題が解決した場合は、チェックボックスをクリックして承認済みとしてマークすることも検討してください。ありがとう!
-strugee

回答:


9

私の知る限り、systemdはこれを特にうまく処理しません。私が理解しているように、あなたは、の動作をオーバーライドしたいsshd.serviceですか?

幸いなことに、systemdはこのようなことを想定して設計されています。サービス定義をに配置するだけで/etc/systemd/system/ssh.service、実行systemctl daemon-reloadしてユニットファイルを再ロードすると、systemdはsystemの代わりにその構成を自動的に使用しますssh.service

systemctl enable mysshd.service仕事もしたいですか?問題ない。では[Install]あなたのユニットファイルのセクション、という行を追加しますAlias=mysshd.service。次にsystemctl reenable ssh.service、systemdにユニットのシンボリックリンクを修正させるために実行すると、黄金色になります。

今、あなたは何をすべきかについての詳細を与えmysshd.serviceていません。それが通常のものと完全に異なる場合ssh.service、素晴らしい!上記の方法を使用します。ただし、1つの小さなものだけを変更したい場合は、間違ったアプローチを使用しています。systemdを使用すると、通常のユニットファイルの上に適用されるユニットファイルの「スニペット」を作成できます。これにより、ユニットファイルの残りの部分がパッケージマネージャーから更新を受信できるようにしながら、個々のディレクティブを追加またはオーバーライドできます。これを行うには、作成するだけ/etc/systemd/system/ssh.d/my-custom-config.confです(my-custom-config.conf好きな名前に変更できます。また、複数のオーバーライドファイルを作成することもできます)。そのファイルに、通常のに変更または追加するディレクティブを配置しますssh.serviceAlias=ディレクティブを追加することもできますので、systemctl start mysshd.serviceうまくいきます!実行することを忘れないでくださいsystemctl daemon-reload完了したら(および使用した場合はAlias=systemctl reenable ssh.service)。

余談ですが、 systemdユニットファイルを変更しないでください/usr/lib/systemd。今まで!Filesystem Hierarchy Standard では、これ/usrが読み取り専用として扱われる必要があります。実際には、これはパッケージマネージャーが/usr(を除く/usr/local)を処理することを意味し、パッケージマネージャーが処理するものには手を加えません-特に変更したものはおそらく最終的に上書きされるためです。代わりに、のような場所にあなたのものを置きます/etc


1
少し明確にするために、オーバーライドする場合foo.serviceはを実行しsudo systemctl edit foo.service、入力した内容を保存します/etc/systemd/system/foo.service.d/override.conf
-Rockallite

また、Alias=ディレクティブはオーバーライドファイルでは機能しません。参照してくださいgithub.com/systemd/systemd/issues/1090
Rockallite

@Rockalliteはsystemctl edit、この回答を書いた時点では知りませんでした。Alias=バグを反映するように回答を自由に編集してください(「OKで回答者」または編集メッセージに何かを入力してください)。良いキャッチ。
17

5

linkフルパスで使用:

systemctl link /home/nick/myservice.service

既にリンクになっているサービスファイルはリンクできないことに注意してください。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.