私は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
何があってもひどいようですが、うまくいきます。