Crontab shellscript 未正确使用 GUI 主题

Crontab shellscript 未正确使用 GUI 主题

我有一个脚本,它每天检查 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

一切正常,除了对话框的外观,它似乎忽略了我当前的主题(窗口装饰除外)。​​我怀疑我在脚本路径名之前的那部分遗漏了一些东西,无法让脚本使用我的主题。

屏幕截图显示了 crontab 的对话框(顶部)以及它正常时的样子(底部)。 在此处输入图片描述

答案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 元素的脚本。

为了记录在案,我想总结一下我是如何做到的:

  1. 为用户 systemd 服务创建目录和配置文件:

    mkdir "/etc/systemd/[email protected]"

    sudo touch "/etc/systemd/[email protected]/local.conf"

  2. 将以下内容复制并粘贴到此文件中:

[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"
  1. 创建目录并获取用户环境设置的数据:

    mkdir "~/.config/environment.d"

    systemctl --user show-environment > "~/.config/environment.d/user.conf"

  2. 为 systemd 用户文件创建目录:

    mkdir "~/.config/systemd/user"

  3. 为每个作业创建服务文件(例如“ 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
  1. 启用新创建的服务和计时器:

    systemctl --user enable test.timer

相关内容