当我从终端运行脚本时,它运行良好,但它无法与 cron 一起使用。为什么?

当我从终端运行脚本时,它运行良好,但它无法与 cron 一起使用。为什么?

我正在创建一个脚本来管理我的图标,并且我正在使用命令gvfs-set-attribute来执行此操作。当我使用终端运行该脚本时,它运行良好,但当我使用时,它无法运行cron。以下是我的问题的简化版本:

#!/bin/bash

PATH=/home/myUser/bin:/home/myUser/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/home/myUser/.local/share/gvfs-metadata

gvfs-set-attribute -t string /home/myUser/myFolder metadata::custom-icon file:///home/myUser/myImage.png

我已经使用crontab -e并设置了我的脚本每分钟运行一次* * * * * /home/myUser/script.bash。问题是当我用 运行它时,这个脚本根本不起作用cron

我已经PATH按照我的脚本编写了其他问题,命令的输出whereis gvfs-set-attribute是:

gvfs-set-attribute: /usr/bin/gvfs-set-attribute /usr/share/man/man1/gvfs-set-attribute.1.gz

因此,我假设这里的 没有任何问题PATH。我还尝试直接使用绝对路径运行我的脚本:/usr/bin/gvfs-set-attribute。但这些方法都行不通……有人知道发生了什么吗?为什么我不能使用gvfs-set-attribute和命令cron

答案1

尝试将这一行添加到您的脚本中(显然在调用之前gvfs-set-attribute):

export $(cat /proc/$(pgrep gnome-session)/environ | grep -z ^DBUS_SESSION_BUS_ADDRESS)

它从您现有的 gnome-session 中获取DBUS_SESSION_BUS_ADDRESS环境变量。但这有两个假设:

  1. 你正在运行 gnome-session;并且
  2. 只有一个 gnome-session

如果有多个 gnome-sessions(即多个用户各一个),您可以通过将选项添加到 来更改此行以适用于特定用户-upgrep例如:

export $(cat /proc/$(pgrep gnome-session -u myUser)/environ | grep -z ^DBUS_SESSION_BUS_ADDRESS)

如果您不使用 gnome - 那么我认为这将适用于其他桌面环境,通过替换gnome-session为另一个值 - 例如lxsessionLXDE。

答案2

cron作业不在 X 窗口系统下运行,并且通常不访问 GUI 对象。

然而,你可以作弊。

在终端中,在 GUI 下运行:

xhost +localhost

echo "export DISPLAY=\"$DISPLAY\"" >$HOME/.display

并且,在工作即将开始时cron

source $HOME/.display

man xhost

相关内容