我使用 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
无论如何看起来都很糟糕,但效果很好。