systemctl --userコマンドをrootとして実行する

systemctl --userコマンドをrootとして実行する

systemctl --user組織を管理するにはルートが必要です。

これでuser1systemdユーザーユニットを設定しました。ユーザーが端末やGUI、SSH経由で直接ログインすれば、すべてのsystemctl --user命令を実行することができる。

ユーザーがログインしている間は、rootとして次のコマンドを実行し、systemctl --user問題なくそのユーザーに対してすべてのコマンドを実行できます。

su - user1 -c "systemctl --user status myunit.service"

ただし、ユーザーがログアウトすると、systemctl --userrootを含む誰もそのユーザーとしてコマンドを実行できません。ずっと手に入れる

Failed to connect to bus: No such file or directory

ルートとして実行してもsudo - user1十分ではなく、同じエラーが発生します。ユーザーの組織を管理するには、ユーザーが実際にログインする必要があります。

明らかに、これは既知の「問題」です(システムが設計どおりに機能するときに参照されます)。

メモ:sで環境変数を設定しようとしましたが、XDG_RUNTIME_DIR役に立ちませんでした。user1bashrc

他のユーザーが解決策を見つけたようですが、うまくいきません。開発者は自分自身を承認していないようです。アイデア

私が見つけた唯一の回避策は、ユーザーアカウントに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'

関連情報