我有一个脚本,它每天检查 Calibre 网站是否有更新,并在有新版本可用时通知我。它的 crontab 条目如下:
0 12 * * * DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$(id -u)/bus /home/sadi/.local/share/bin/cron-daily-jobs.zsh 2> /home/sadi/.local/share/cron-user.log 2>&1
一切正常,除了对话框的外观,它似乎忽略了我当前的主题(窗口装饰除外)。我怀疑我在脚本路径名之前的那部分遗漏了一些东西,无法让脚本使用我的主题。
答案1
通过cron
、 或at
或运行的作业batch
不会在桌面上的同一运行时环境中运行。您的任何PATH
更改或其他环境变量设置都不会自动传播到您的cron
作业。例如,没有$DISPLAY
,因此 GUI 程序需要特殊处理(阅读man xhost
)。
cron
人们可以在crontab
文件 Read中为所有作业设置环境变量man 5 crontab
。
echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias
查看每个环境中的结果 。
由于command
该行的一部分crontab
默认由 解释/bin/sh
,其语法比 更简单/bin/bash
,因此我建议command
调用一个bash
脚本(可执行、已安装、以 开头#!/bin/bash
)来设置环境,然后调用所需的程序。
答案2
我终于解决了这个问题,方法是从定时任务到systemd 服务计时器,它似乎更适合带有 GUI 元素的脚本。
为了记录在案,我想总结一下我是如何做到的:
为用户 systemd 服务创建目录和配置文件:
mkdir "/etc/systemd/[email protected]"
sudo touch "/etc/systemd/[email protected]/local.conf"
将以下内容复制并粘贴到此文件中:
[Service] Environment="PATH=/usr/lib/ccache/bin:/usr/local/bin:/usr/bin:/bin" Environment="EDITOR=nano -c" Environment="BROWSER=firefox" Environment="NO_AT_BRIDGE=1"
创建目录并获取用户环境设置的数据:
mkdir "~/.config/environment.d"
systemctl --user show-environment > "~/.config/environment.d/user.conf"
为 systemd 用户文件创建目录:
mkdir "~/.config/systemd/user"
为每个作业创建服务文件(例如“
test.service
”)和相应的计时器文件(例如“test.timer
”):
示例服务文件内容:
[Unit] Description=Perform systemd service timer test [Service] ExecStart=~/.local/bin/test [Install] WantedBy=default.target
示例服务文件内容:
[Unit] Description=Run test service every 10 minutes [Timer] OnCalendar=*:0/10:0 Persistent=false [Install] WantedBy=default.target
启用新创建的服务和计时器:
systemctl --user enable test.timer