毎晩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"
}