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

おすすめ記事