Cron 无法成功更改背景

Cron 无法成功更改背景

我运行的是 12.04 版,带有自定义 XML 背景(Ubuntu Day 上的修改),它会根据一天中的时间而变化。我注意到,在 XML 文件中计划进行更改的时间与更改实际显示在背景上的时间之间存在显著的延迟。我还注意到,当我从暂停状态恢复时,我也没有得到正确的背景图像。我发现手动循环切换壁纸可以解决这个问题,我已经编写了一个脚本来自动执行该过程。

如果我手动执行脚本,它会正常工作。但是,当我安排脚本在 cron 中运行时,cron 不会更改背景。为了确保脚本由 cron 正确运行,我让它在运行背景更改后在我的主文件夹中创建一个目录,并且该目录创建成功,所以我知道 cron 正在运行并执行脚本。

我的脚本:

#!/bin/bash

sleep 5
gsettings set org.gnome.desktop.background picture-uri
file:///home/zak/Pictures/Wallpaper/DOU2.xml
sleep 1
gsettings set org.gnome.desktop.background picture-uri 
file:///home/zak/Pictures/Wallpaper/DOU.xml
sleep 1
mkdir /home/zak/iscronworking

exit

cron 无法访问吗gsettings?该作业位于我的用户 crontab 上,因此不应以 root 身份运行。

答案1

显然gsettings需要设置一些变量。由于 CRON 仅使用一组非常有限的环境变量,因此您必须在脚本之前设置它们。在 CRON 行中使用以下代码。

30 */2 * * * DISPLAY=:0 GSETTINGS_BACKEND=dconf /your/path/your-script.sh

在示例中,作业设置为每 2 小时的第 30 分钟运行一次。我尝试将变量插入脚本,以获得更清晰的行,但没有结果,如果有人找到方法,请告诉我们。

对这些设置感到困惑ArchLinux 论坛

上述解决方案不再适用于生动

让它工作的最佳方法确实是找到DBUS_SESSION_BUS_ADDRESS变量,在下面的脚本中,我使用循环for来完成这项工作,因为使用pidof特定的应用程序(例如)gnome-session并不总是对我有用,而较新的应用程序DBUS ADDRESS可能有所不同,因为在我的特定情况下,我在启动时使用我的用户名启动了一些守护进程。为了有效地更改我正在使用的壁纸,dconf但您也可以使用gsettings。因此,请根据您的用例调整脚本。

#!/bin/bash -e
user=$(whoami)

fl=$(find /proc -maxdepth 2 -user $user -name environ -print -quit)
while [ -z $(grep -z DBUS_SESSION_BUS_ADDRESS "$fl" | cut -d= -f2- | tr -d '\000' ) ]
do
  fl=$(find /proc -maxdepth 2 -user $user -name environ -newer "$fl" -print -quit)
done

export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS "$fl" | cut -d= -f2-)

if [ $# -gt 0 ]
then
  PICS_PATH=$1
else
  PICS_PATH="/home/public/Pictures/Wallpaper/"
fi

IMG=$(find -L $PICS_PATH -name "*.jpg" -o -name "*.png" | shuf -n1)
#gsettings set org.gnome.desktop.background picture-uri "file://${IMG}"
dconf write "/org/gnome/desktop/background/picture-uri" "'file://${IMG}'"

echo -e "$(date): ${IMG}" >> /tmp/wallch.log

在 crontab 中添加以下行以每偶数小时更换壁纸

0 */2 * * * /path/to-above-script.sh /path/to-wallpapers/

答案2

发生这种情况是因为 cron 仅使用一组非常有限的环境变量。当将其设置为 cron 作业时,负责以正确方式运行问题中脚本的唯一环境变量是DBUS_SESSION_BUS_ADDRESS,而不是DISPLAYGSETTINGS_BACKEND或其他。

因此,您必须DBUS_SESSION_BUS_ADDRESS在脚本中导出环境变量。请参阅我的回答中的更多解释这里

最后,你的脚本看起来应该是这样的:

#!/bin/bash

PID=$(pgrep gnome-session)
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ|cut -d= -f2-)

sleep 5
gsettings set org.gnome.desktop.background picture-uri file:///home/zak/Pictures/Wallpaper/DOU2.xml
sleep 1
gsettings set org.gnome.desktop.background picture-uri file:///home/zak/Pictures/Wallpaper/DOU.xml

答案3

在 Ubuntu 22.04 中我必须执行以下操作:

crontab -e

*/15 * * * * env DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus /home/user/code/your_bash_script.sh

env我之前没有添加,DISPLAY所以它不起作用。

来源:https://www.roboleary.net/2021/09/02/linux-change-wallpaper.html

答案4

大约一个月前我开始遇到同样的问题。我还创建了一个用于gsettings更改 Gnome Shell/Unity 中的桌面背景的脚本。

手动运行此命令会立即更新桌面背景。我还使用 cron 来安排脚本的执行:

0,30 * * * * DISPLAY=:0.0 nextwall /home/serrano/Pictures/backgrounds/

和您的情况一样,cron 成功运行了脚本,并且新的壁纸 URI 已成功设置gsettings。您可以通过运行以下命令进行测试:

gsettings get org.gnome.desktop.background picture-uri

但是,当 cron 运行脚本时,桌面背景不会更新(大约一个月前,这个功能还可以用)。有趣的是,当我右键单击桌面并选择“更改桌面背景”时,桌面背景突然更新为正确的图像。

因此,出于某种原因,从 cron 更改桌面背景不再触发 Nautilus 更新桌面背景。我怀疑这是一个错误,所以我刚刚针对此问题提交了一个错误报告:https://bugs.launchpad.net/ubuntu/+source/nautilus/+bug/1033034

如果您遇到同样的问题,请点击“这个错误是否影响您?”链接。

相关内容