我有这个脚本可以从我的 gnome 桌面更改背景和屏幕保护程序。手动执行时工作正常,但当我将其放入 cron 时,它不会执行。该文件是可执行的。
我添加了 cron 作业crontab -e。
这是脚本:
#!/bin/bash
# change_background - Change desktop background and lockscreen background randomly
# Export DBUS_SESSION_BUS_ADDRESS environment variable
euid=$(id --real --user)
pid=$(pgrep --euid $euid gnome-session)
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$pid/environ|cut -d= -f2-)
# Wallpapers directory
dir="/home/myuser/Pictures/Wallpapers"
# Wallpaper and screensaver files
background=$(ls $dir/* | shuf -n1)
screensaver=$(ls $dir/* | shuf -n1)
# Set the wallpaper and screensaver
gsettings set org.gnome.desktop.background picture-uri file://$background
gsettings set org.gnome.desktop.screensaver picture-uri file://$screensaver
我的脚本位于我的 bin 目录中/home/myuser/bin它被添加到 PATH 变量中。
crontab -l输出:
# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of week (0 - 6) (Sunday to Saturday;
# │ │ │ │ │ 7 is also Sunday on some systems)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * command
#
# --- Change background every minute --- #
#
* * * * * change_background
#
# --- ------------------------------ --- #
我的问题是:为什么 cron 不执行我的脚本?我做错了什么?
答案1
问题似乎已经crontab 中的环境未设置正确PATH
,因此从未找到该脚本。用户的 shell 初始化文件不是由 cron 运行的,因此PATH
在其中设置 或其他变量对于 cron 作业来说是无用的。
这可以通过多种方式解决。
一种是简单地PATH
在 crontab 中设置(以及任何其他需要特定值的变量)(这也会更改脚本的这些变量的值,并且所有其他工作在 crontab 中):
PATH=/home/myuser/bin:$PATH
另一种是使用绝对路径执行脚本:
* * * * * /home/myuser/bin/change_background
如果执行的其他作业需要PATH
针对脚本本身正在使用的特定事物单独修改变量(然后脚本本身将PATH
尽早设置,或者以例如启动env PATH=... /some/path/program
),那么这可能是更好的选择。
答案2
尝试 :
* * * * * env DISPLAY=:0 /path/to/bash/script.sh