i3-msg 'restart'を間接的に実行すると、システムプロセスはIPCソケットを開くことができません。

i3-msg 'restart'を間接的に実行すると、システムプロセスはIPCソケットを開くことができません。

私はArch Linuxを使用し、systemdで実行される独自のサービスを作成しました。

[Unit]
Description=my service
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/myservice
Environment=DANS_CONFIG=/home/user/.config/dans/myconfig.toml

[Install]
WantedBy=default.target

(rustコード)を介してスクリプトが実行されるまで、サービスは正常に実行されます。

Command::new("sh").arg("-c").arg("/home/user/.config/scripts/i3change.py").output()

実行されたプログラムは次のことを行います(Python):

import os
os.system('i3-msg restart')

systemctl logを介して次の出力を取得します。 i3-msg: Could not connect to i3 on socket /tmp/i3-ipc.sock: No such file or directory

しかし、端末でi3-msgコマンドを実行すると、すべてがうまく機能します。また、サービスで実行されているPythonスクリプトのグループとユーザーを変更してみましたが、役に立ちませんでした。

システムサービス呼び出しスクリプトを正常に実行するにはi3-msg restart

答え1

同じ問題に直面しています。 IPCソケットは各ユーザーに対して作成され、/run/user/{id}/i3(また)ファイル名に一種のセッション番号があるようです。したがって、i3-msgそのユーザーとして実行している場合(sshセッションまたはシェルセッションに変数がないユーザーのsystemdサービスを介してI3SOCK)、次のように実行する必要があります。

i3-msg --socket=`ls /run/user/1000/i3/ipc-socket.*` restart

何があってもひどいようですが、うまくいきます。

関連情報