我正在尝试创建一个 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"
}