追加読書

追加読書

systemctl --userデスクトップユーザーにとってはうまくいくようです。

dev@dev-VirtualBox:~$ systemctl --user > /dev/null
dev@dev-VirtualBox:~$ echo $?
0

しかし、www-dataユーザーとして同じコマンドを実行すると、予期しない応答がありました。

dev@dev-VirtualBox:~$ sudo su www-data -s /bin/bash
www-data@dev-VirtualBox:~$ systemctl --user > /dev/null 
Failed to connect to bus: No such file or directory 
www-data@dev-VirtualBox:~$ echo $? 
1

ここでどのようにアクティブにしますかsystemctl --user

Ubuntu 16.04実行

答え1

これユーザーインスタンスごとsystemdはログインプロセス(PAM)のHookから始まり、pam_systemd通常の仮想/実際の端末ログインとSSHなどを介したリモートログインに使用されます。

ログインしていません。 特権を強化しています。既存のログインセッションそしてsudo su www-data。 (しかしこれは重複しています。スーパーユーザーとしてコマンドを実行することなくsudo -u www-dataすぐに開始されますwww-data。)まだフックを呼び出していません。

したがって、www-datasystemdのユーザー固有のインスタンスはまだ起動されておらず、systemctl --user会話したい項目が見つかりません。

手動で起動できます。

%sudo install -d -o www-data /run/user/`id -u www-data`
% sudo systemctl start user@`id -u www-data`

(間違った順序で実行した場合は、サービスを停止して正しい順序で実行してください。間違った順序で実行すると、最終的に空のランタイムディレクトリが発生し、D-Busや他のソケットファイルがありませんが、サービスは実行中です。クライアントとは絶対に通信しませんではありません)。

1つのトリッキーなことは、別のアカウントの権限でデスクトップバスクライアントプログラムを実行するときに別のアカウントのデスクトップバスエージェントと通信できるDBUS_SESSION_BUS_ADDRESSように変数を変更する必要があることです。systemctl

% sudo -u www-data DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/`id -u www-data`/bus systemctl --user

これが簡単な方法です。より洗練されたアプローチは、フックがsudo呼び出されるようにPAM設定を調整することですpam_systemd。ただし、XDG_RUNTIME_DIR特に環境変数に関して望ましくない副作用がある可能性があります。発生した効果に耐えることができると確信している場合にのみ、このpam_systemd回避策を試してくださいsudo

追加読書

答え2

それで、ついに失われたパズルのピースを見つけました。 @JdeBPの優れたヒントのおかげで、次のことがわかりました。

  • systemd --userがwww-dataのために実行されています。
  • UbuntuではDBUS_SESSION_BUS_ADRESSが無視されるようです。
  • XDG_RUNTIME_DIR が設定されていません。

"/run/user/$UID"をエクスポートするようにXDG_RUNTIME_DIRを設定することで問題が解決しました。

予想される動作を得るために従う必要があるステップは次のとおりです。

% sudo loginctl enable-linger www-data # Enable systemd --user service to start at boot
% XDG_RUNTIME_DIR="/run/user/$UID" systemctl --user # Access services as www-data without actually logging in

答え3

これは非常に醜い解決策です。

言ったように、質問は次のとおりです。

ログインしていません。既存のログインセッションの権限を強化しています[...]

だから「ただ」ログインしてください...

サーバーにいる場合は、端末を使用する必要があります。 同じ質問をする必要があります。しかし、ついに発見しました。解決策はとても簡単です。次のコマンドを実行してユーザーに切り替えます(各ユーザーで適切なシェルを実行します)。

$ sudo machinectl shell --uid www-data

sudo loginctl enable-linger www-dataブート時に実行されるようにサービスなどを開始したい場合でも、それはまだ便利です。それ以外の場合は、そのユーザーが「ログイン」されている場合にのみ実行されます。

答え4

で述べたようにここにコメントがあります。systemctl、ユーザーとして実行できる関連Ubuntuパッケージが見つからない可能性があります。私に起こったことです。修理する:

  1. apt install libpam-systemd

  2. 実行できる必要があるユーザーとしてSSHを介して再度ログインしますsystemctl --user。したがって、rootで実行しないでください。

これで、echo $XDG_RUNTIME_DIR追加の手順なしで動作し、次のように表示されます。

$ echo $XDG_RUNTIME_DIR
/run/user/1012

Ubuntu 18.04 LTSがリリースされました。

関連情報