间接执行 i3-msg 'restart' 时 Systemd 进程无法打开 Ipc 套接字

间接执行 i3-msg 'restart' 时 Systemd 进程无法打开 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 脚本的组和用户,但这没有帮助。

如何成功让 systemd 服务调用脚本运行i3-msg restart

答案1

面临同样的问题。看起来,IPC 套接字是为每个用户创建的,/run/user/{id}/i3并且(也)在文件名中具有某种会话数字。因此,如果您i3-msg以该用户身份运行(通过 ssh 或用户的 systemd 服务,其中您的 shell 会话没有I3SOCK变量),您应该执行类似的命令

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

无论如何看起来都很糟糕,但效果很好。

相关内容