2015-12-08 7 views
13

システムの起動時に開始したいサービスがあります。多くのインスタンスが存在する可能性があるため、テンプレートとしてap @ .service定義を構築しました。sudo su - myuserの後に 'systemctl --user'を使ってユーザシステムを制御できますか?

ルートシステムで定義されていますが、これは正常に動作し、システムのサービスを開始および停止します。サービスインスタンスは、期待どおりにsystemctl enable [email protected]でインストールされます。ルートも問題なくサービスを開始および停止できます。このサービスは、rootではなく自分のアカウント(myuser)で実行され、ap @ .serviceテンプレートのUser = myuserによって制御されます。

しかし、ユーザー 'myuser'がシステムのセキュリティを損なうことなく、自分のサービスを開始して停止できるようにしたい。

私はユーザシステムを使用して切り替えましたが、有効期限はloginctl enable-linger myuserです。 〜myuser/.config/systemd/userディレクトリに定義されているサービスを有効にします。このサービスは、システムの設計どおりに開始され、正常に停止します。私が端末に「myuser」としてログインすると、systemctl --user start [email protected]systemctl --user stop [email protected]はどちらも完璧に動作します。私は別のユーザー(ユーザー2)としてログインし、ターミナルでsudo su - myuserを行う場合

しかし、その後、systemctl --userコマンドは現在、エラーメッセージで失敗「D-バス接続の取得に失敗しました:そのようなファイルまたはディレクトリ」。

ユーザーを切り替えるコマンドsudo su - myuserの後に、systemctl --userを有効にするにはどうすればよいですか?

+0

あなたのCWDはまだ他のユーザのホームディレクトリですか?呼び出し元のユーザーに現在のディレクトリを表示する権限がない場合、ユーティリティによっては問題があります。 – Dave

+0

こんにちはDave ...ホームディレクトリは、sudoコマンドで - によって強制的に切り替えられました。 CWDが新しいユーザのホームディレクトリに変更されました。 – NeilCasey

+0

ああ。私を無視してください。 – Dave

答えて

13

私は別のサイトで答えを見つけ、別の用語を使ってさらに検索しました。

必要な解決策は、正しいDBUSに到達するための情報をシェルに提供することでした。

systemctl --userを実行する前にシェルに次の環境変数を追加すると、DBUSの問題は解決され、systemctlは正しく動作します。

export XDG_RUNTIME_DIR="/run/user/$UID" 
export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus" 

DBUS_SESSION_BUS_ADDRESSはsudoのシェルで利用可能であることを保証するために、私は、ターゲット・ユーザーIDの〜/ .bash_profileのに環境変数を追加しました。これには、正しい環境を作成するためにログインシェル(sudo su - myuserまたはsudo -l myuser)が作成されている必要があります。

また、〜/ .bashrc(または他のシェルでは同等)に環境変数の作成を追加します。すべてのシェル作成のために環境が新たに確立されます。

関連する問題