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()

실행된 프로그램은 다음을 수행합니다(파이썬):

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

무슨 일이 있어도 끔찍해 보이지만 훌륭하게 작동합니다.

관련 정보