매일 밤 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"
}