systemd 타이머를 통해 쉘 스크립트에서 X 애플리케이션 실행

systemd 타이머를 통해 쉘 스크립트에서 X 애플리케이션 실행

매일 밤 9시에 사용할 systemd(사용자) 타이머를 만들려고 합니다 xdg-open. 파일은 다음과 같습니다.

/home/me/.config/systemd/user/test.service

[Unit]
Description=Test

[Service]
Type=simple
Environment=DISPLAY=:0
ExecStart=/bin/bash /home/me/test.sh

/home/me/.config/systemd/user/test.timer

[Unit]
Description=Test Timer
RefuseManualStart=no
RefuseManualStop=no

[Timer]
Persistent=true
OnCalendar=*-*-* 21:00:00

[Install]
WantedBy=timers.target

/home/me/test.sh

#!/bin/bash


websites=(
    "http://unix.stackexchange.com/"
    "http://stackoverflow.com/"
)

for i in "${websites[@]}"
do
    # works with /usr/bin/firefox
    /usr/bin/xdg-open "$i"
done

아무것도 열리지 않습니다.

위 파일에서 로 바꾸면 xdg-open탭이 열립니다. firefox그러나 xdg-open "http://unix.stackexchange.com/"터미널에서 실행하면 Firefox에서 탭이 열립니다.


systemctl --user start test.service 
systemctl --user status test.service 

인쇄:

● test.service - Test
   Loaded: loaded (/home/me/.config/systemd/user/test.service; static; vendor preset: enabled)
   Active: inactive (dead)

Jun 29 15:06:59 me-PC systemd[1513]: Started Test.

이 타이머를 어떻게 작동하게 할 수 있나요 xdg-open?

답변1

스크립트를 수동으로 실행하는 것과 systemd를 통해 실행하는 것의 차이점은 일반적으로 환경의 차이로 인해 발생합니다. 호출하기 전에 해당 줄에 xdg-open명령을 추가하면 환경이 덤프됩니다 .env

이제 수동으로 테스트를 실행하세요 systemd. 그 외에도 DISPLAY차이를 유발할 수 있는 다른 변수를 찾아보세요 . 스크립트 에 환경 변수를 계속 추가하면 이 작업을 수행하는 데 필요한 환경 변수를 systemd찾을 수 있습니다 .systemd

테스트의 bash 코드는 좋아 보이지만 관심이 있는 경우 더 관용적인 개정판이 있습니다. bash공백으로 인해 자연스럽게 분할되며 URL에 공백이 포함되어 있지 않으므로 이 대체 코드가 작동합니다. 또한 do/done이를 중괄호로 교체했습니다.

websites="
    http://unix.stackexchange.com/
    http://stackoverflow.com/"

for i in $websites; {
    # works with /usr/bin/firefox
  /usr/bin/xdg-open "$i"
}

관련 정보