我正在创建一个脚本来管理我的图标,并且我正在使用命令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
环境变量。但这有两个假设:
- 你正在运行 gnome-session;并且
- 只有一个 gnome-session
如果有多个 gnome-sessions(即多个用户各一个),您可以通过将选项添加到 来更改此行以适用于特定用户-u
。pgrep
例如:
export $(cat /proc/$(pgrep gnome-session -u myUser)/environ | grep -z ^DBUS_SESSION_BUS_ADDRESS)
如果您不使用 gnome - 那么我认为这将适用于其他桌面环境,通过替换gnome-session
为另一个值 - 例如lxsession
LXDE。
答案2
cron
作业不在 X 窗口系统下运行,并且通常不访问 GUI 对象。
然而,你可以作弊。
在终端中,在 GUI 下运行:
xhost +localhost
echo "export DISPLAY=\"$DISPLAY\"" >$HOME/.display
并且,在工作即将开始时cron
:
source $HOME/.display
读man xhost
。