systemctl --user
組織を管理するにはルートが必要です。
これでuser1
systemdユーザーユニットを設定しました。ユーザーが端末やGUI、SSH経由で直接ログインすれば、すべてのsystemctl --user
命令を実行することができる。
ユーザーがログインしている間は、rootとして次のコマンドを実行し、systemctl --user
問題なくそのユーザーに対してすべてのコマンドを実行できます。
su - user1 -c "systemctl --user status myunit.service"
ただし、ユーザーがログアウトすると、systemctl --user
rootを含む誰もそのユーザーとしてコマンドを実行できません。ずっと手に入れる
Failed to connect to bus: No such file or directory
ルートとして実行してもsudo - user1
十分ではなく、同じエラーが発生します。ユーザーの組織を管理するには、ユーザーが実際にログインする必要があります。
明らかに、これは既知の「問題」です(システムが設計どおりに機能するときに参照されます)。
メモ:sで環境変数を設定しようとしましたが、XDG_RUNTIME_DIR
役に立ちませんでした。user1
bashrc
他のユーザーが解決策を見つけたようですが、うまくいきません。開発者は自分自身を承認していないようです。アイデア。
私が見つけた唯一の回避策は、ユーザーアカウントにSSHでアクセスし、公開鍵で認証し、次のコマンドを実行することです。
ssh user1@localhost -f 'systemctl --user status myunit.service'
SSH接続を必要としない回避策を探しています。ユーザーがログインしていない場合、システムのユーザー単位を管理するにはrootが必要です。どうやってこれを達成できますか?
答え1
システム248-M username@
(2021年3月リリース)他のユーザーを指定するための構文サポートが導入されました。
$ sudo systemctl --user -M user1@ status myunit.service
参照: ドキュメントに記載されている新機能情報
(このソリューションは動作するために実行する必要はありませんloginctl enable-linger user1
)
答え2
su
またはを使用する代わりに、sudo
これを使用machinectl
すると、正しいユーザーセッションとコンテキストを取得できます。
su
/で行ったように、シェルに直接入れることができますsudo
。
machinectl shell [email protected]
...特定のユーザーのコンテキストで必要なものを実行するか、cmdを渡して次の追加引数で実行できます。
machinectl shell [email protected] $(which bash) -c "systemctl --user status myunit.service"
$(which bash) -c を引用符で囲まないように注意してください。
答え3
私は実際にユーザーが実際にログインせずにこれを行うことができる非常にきれいな方法を見つけました。 rootユーザーに対してリンガーを有効にするには、loginctlを使用する必要があります。
loginctl enable-linger user1
これで状態を確認できます。
loginctl user-status user1
これには、システムプロセスでユーザーが実行するすべてのプロセスを一覧表示する必要があります。これで、ユーザーは実際にログインせずにrootとして実行できます。
runuser -l user1 -c 'systemctl --user status myunit.service'