Sol*_*oid 8 wallpaper scripts cron background
我正在使用自定义 XML 背景(在 Ubuntu 日修改)运行 12.04,该背景会根据一天中的时间发生变化。我注意到,更改计划在 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
Run Code Online (Sandbox Code Playgroud)
cron 只是无法访问gsettings吗?该作业在我的用户 crontab 上,因此不应以 root 身份运行。
per*_*iro 12
显然gsettings需要设置一些变量。因为 CRON 只使用一组非常有限的环境变量,所以您必须在脚本之前设置它们。在 CRON 行中使用以下代码。
30 */2 * * * DISPLAY=:0 GSETTINGS_BACKEND=dconf /your/path/your-script.sh
Run Code Online (Sandbox Code Playgroud)
在示例中,作业设置为在第 30 分钟每 2 小时运行一次。我试图将变量插入脚本中,以获得更清晰的线条,但没有结果,如果有人找到方法来做到这一点,请告诉我们。
在ArchLinux 论坛中偶然发现了这些设置。
上述解决方案不再适用于Vivid。
得到这个工作的最好方法是确实找到DBUS_SESSION_BUS_ADDRESS变量,在下面的脚本我使用一个for回路,因为做这项工作pidof的特定应用程序像gnome-session从来不为我工作和newers应用有不同的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
Run Code Online (Sandbox Code Playgroud)
在 crontab 中添加以下行以每隔一小时更换一次壁纸
0 */2 * * * /path/to-above-script.sh /path/to-wallpapers/
Run Code Online (Sandbox Code Playgroud)
发生这种情况是因为 cron 仅使用一组非常有限的环境变量。唯一的一个环境变量,它负责从当此设置的问题以正确的方式运行该脚本的cron任务是DBUS_SESSION_BUS_ADDRESS,不是DISPLAY或者GSETTINGS_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
Run Code Online (Sandbox Code Playgroud)
大约一个月前我开始遇到同样的问题。我还创建了一个脚本,用于gsettings更改 Gnome Shell/Unity 中的桌面背景。
手动运行此命令会立即更新桌面背景。我还使用 cron 来安排脚本的执行:
0,30 * * * * DISPLAY=:0.0 nextwall /home/serrano/Pictures/backgrounds/
Run Code Online (Sandbox Code Playgroud)
正如您的情况,cron 成功运行脚本,并且新的壁纸 URI 已在 中成功设置gsettings。您可以通过运行来测试:
gsettings get org.gnome.desktop.background picture-uri
Run Code Online (Sandbox Code Playgroud)
但是,当 cron 运行脚本时,桌面背景不会更新(这直到大约一个月前才有效)。有趣的是,当我右键单击桌面并选择“更改桌面背景”时,桌面背景突然更新为正确的图像。
因此,出于某种原因,从 cron 更改桌面背景不再触发 Nautilus 更新桌面背景。我怀疑这是一个错误,所以我刚刚为此问题提交了错误报告:https://bugs.launchpad.net/ubuntu/+source/nautilus/+bug/1033034
请点击“此错误对您有影响吗?” 如果您有同样的问题,请链接。
| 归档时间: |
|
| 查看次数: |
5700 次 |
| 最近记录: |