root以外のユーザーがユーザーデーモンとして起動するようにsystemdサービスを設定するにはどうすればよいですか?


20

arch-linuxシステム(2012.09.07)でsystemdのインストールおよびセットアッププロセスを完了しました。アンインストールしましたinitscripts(構成ファイルを削除しました)。

私がやりたいのは、非rootユーザーが開始および停止できるサービスを作成することです。サービスは、rtorrentを実行している分離されたスクリーンセッションを開始することです。ただし、このサービスを開始(有効化)するように設定したシステム上のすべてのユーザーに、特定のインスタンスを明確に開始してもらいたい。これをどのように行うのでしょうか?

systemdがサービスのユーザーインスタンスをサポートしていることを読んだことを覚えていますが、これを設定する方法や、探しているものに関連する情報が見つかりませんでした。

システムに使用したサービスファイル:

[Unit]
Description=rTorrent

[Service]
Type=forking
ExecStart=/usr/bin/screen -d -m -S rtorrent /usr/bin/rtorrent
ExecStop=/usr/bin/killall -w -s 2 /usr/bin/rtorrent

更新#1

こちらこちらの manページを読んだ後、systemdの動作が少し良くなったことがわかりました。特に、User=およびWorkingDirectory=オプションを使用すると、ユーザーのセッションでサービスを開始できます。しかし、問題はまだユーザー自身ができないことに変わりはないstartstopenable、またはdisableサービス。アンのアクセスが拒否され、エラーがで与えられますsystemctl

更新#2

まず、簡素化とsystemdのユーザーセッション(まだやや不完全)の機能を使用するために、sofarのuser-session-unitsを使用し、彼の構成アドバイスに従いました。

現在のバージョンのDBus(1.6.4-1)にはDBUS_SESSION_BUS_ADDRESSsystemctl --user次のコマンドでエラーを出力することを意味する環境変数を設定しないというバグがあるようです。

Failed to get D-Bus connection: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11

変数は次のようになります。

DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/USERUID/dbus/user_bus_socket"

どこUSERUIDは、与えられたユーザのUIDである必要があります。


ユーザーごとに個別のサービスファイルを作成し、単純に有効にできることを理解しています。ただし、上記で説明した方法で可能かどうかを知りたいだけです。
ハンス

結構なことsudoです。上記のコメントで述べたように、ユーザー用に簡単なセットアップを行い、ユーザーに独自のサービスファイルを制御させることができます。ただし、このソリューションにより、ユーザーは他のほとんどのサービスも制御できるようになります
ハンス

sudoのドキュメントを読んでいれば、そうはなりません。sudoers(5)には、コマンドの引数を制限する多くの例があります。
grawity

回答:


19

systemdは通常、一般ユーザーがシステムサービスを開始することを許可しません。polkitを介したアクセスの提供はサポートしていますが、その部分はまだいくらか不足しており、特定のサービスを1つだけ許可することはまだできません。

rtorrentは実際にはシステムサービスではなく、すべてのユーザーにrtorrentの独自のインスタンスを持たせたいため、systemdの「ユーザー」モードを試してください。

ログインすると、システムはuser@<uid>.serviceシステムユニットを起動し、systemdの別の「--user」インスタンスを起動します。新しいユーザーにsystemdは(で始まるユニットファイルを読み込みますdefault.targetから)~/.config/systemd/user//etc/systemd/user//usr/lib/systemd/user/


1
おかげで、それは基本的に私が行方不明でした。ただし、DBusの問題でもあることが判明しDBUS_SESSION_BUS_ADDRESSました。特定のユーザーに対して正しいグローバル変数を設定しないdbuseのバグがあるようです 。そのため、systemctlはユーザーセッションにアクセスできず、エラーが発生します。この小さな問題を理解すると、他のすべてが美しく機能します!
ハンス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.