저는 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()
실행된 프로그램은 다음을 수행합니다(파이썬):
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
무슨 일이 있어도 끔찍해 보이지만 훌륭하게 작동합니다.