通过 systemd 计时器从 shell 脚本运行 X 应用程序

通过 systemd 计时器从 shell 脚本运行 X 应用程序

我正在尝试创建一个 systemd (用户)计时器,每天晚上 9 点使用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"
}

相关内容