我写了一个改变壁纸的bash脚本(对于GNOME3)。
#!/bin/bash
# Wallpaper's directory.
dir="${HOME}/images/wallpapers/"
# Random wallpaper.
wallpaper=`find "${dir}" -type f | shuf -n1`
# Change wallpaper.
# http://bit.ly/HYEU9H
gsettings set org.gnome.desktop.background picture-options "spanned"
gsettings set org.gnome.desktop.background picture-uri "file://${wallpaper}"
在终端模拟器(例如gnome-terminal)中执行的脚本效果很好。在执行期间由cron或ttyX终端获取错误:
** (process:26717): WARNING **: Command line `dbus-launch --autolaunch=d64a757758b286540cc0858400000603 --binary-syntax --close-stderr' exited with non-zero exit status 1: Autolaunch error: X11 initialization failed.\n
** (process:26717): WARNING **: Command line `dbus-launch --autolaunch=d64a757758b286540cc0858400000603 --binary-syntax --close-stderr' exited with non-zero exit status 1: Autolaunch error: X11 initialization failed.\n
** (process:26721): WARNING **: Command line `dbus-launch --autolaunch=d64a757758b286540cc0858400000603 --binary-syntax --close-stderr' exited with non-zero exit status 1: Autolaunch error: X11 initialization failed.\n
** (process:26721): WARNING **: Command line `dbus-launch --autolaunch=d64a757758b286540cc0858400000603 --binary-syntax --close-stderr' exited with non-zero exit status 1: Autolaunch error: X11 initialization failed.\n
答案 0 :(得分:38)
最后,经过多次尝试,我设法解决了这个问题。
确实,问题出现是因为cron只使用一组非常有限的环境变量。并且只有一个环境变量负责以正确的方式运行问题中的脚本(当设置为cron作业时)DBUS_SESSION_BUS_ADDRESS
,而不是DISPLAY
或XAUTHORITY
或{{ 1}}或其他东西。这个事实也在this answer中得到了很好的指出。
但是this answer中的问题是无法保证来自GSETTINGS_BACKEND
目录的该文件的DBUS_SESSION_BUS_ADDRESS
变量更新为当前值当前的gnome会话。为了解决这个问题,一种方法是在当前gnome会话中找到进程的PID,并从其环境中获取dbus地址。我们可以这样做:
~/.dbus/session-bus/
话虽如此,脚本应该如下:
PID=$(pgrep gnome-session) # instead of 'gnome-session' it can be also used 'noutilus' or 'compiz' or the name of a process of a graphical program about that you are sure that is running after you log in the X session
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ|cut -d= -f2-)
答案 1 :(得分:7)
我找到了一些解决方案。当您导出文件〜/ .dbus / session-bus / *中包含的变量DBUS_SESSION_BUS_ADDRESS时,dbus-launch不会告诉您有关错误的更多信息。然而,不是壁纸,而是人工制品。
添加了代码:
sessionfile=`find "${HOME}/.dbus/session-bus/" -type f`
export `grep "DBUS_SESSION_BUS_ADDRESS" "${sessionfile}" | sed '/^#/d'`
现在脚本如下所示:
#!/bin/bash
# TODO: At night only dark wallpapers.
# Wallpaper's directory.
dir="${HOME}/images/wallpapers/"
# Weird, but necessary thing to run with cron.
sessionfile=`find "${HOME}/.dbus/session-bus/" -type f`
export `grep "DBUS_SESSION_BUS_ADDRESS" "${sessionfile}" | sed '/^#/d'`
# Random wallpaper.
wallpaper=`find "${dir}" -type f | shuf -n1`
# Change wallpaper.
# https://superuser.com/questions/298050/periodically-changing-wallpaper-under-gnome-3/298182#298182
gsettings set org.gnome.desktop.background picture-options "spanned"
gsettings set org.gnome.desktop.background picture-uri "file://${wallpaper}"
答案 2 :(得分:4)
试过这个,对我来说很有用:
dbus-launch --exit-with-session gsettings set schema key value
或者来自root cron:
sudo -u user dbus-launch --exit-with-session gsettings set schema key value
答案 3 :(得分:0)
要通过cron更改壁纸,只需在crontab中直接执行此操作: 执行crontab -e
添加如下行:
30 09 * * * DISPLAY =:0 GSETTINGS_BACKEND = dconf / usr / bin / gsettings set org.gnome.desktop.background picture-uri file:////home/elison/Pictures/morning.jpg
00 12 * * * DISPLAY =:0 GSETTINGS_BACKEND = dconf / usr / bin / gsettings set org.gnome.desktop.background picture-uri file:////home/elison/Pictures/noon.jpg
答案 4 :(得分:0)
添加导出DISPLAY =:0&& export XAUTHORITY = / home / username / .Xauthority,其中username是您的ubuntu用户名。它应该修复X11授权错误。
答案 5 :(得分:0)
另请参阅对我有用的此解决方案: https://unix.stackexchange.com/questions/111188/using-notify-send-with-cron#answer-111190 :
您需要设置DBUS_SESSION_BUS_ADDRESS变量。默认情况下,cron无法访问该变量。为了解决这个问题,请将以下脚本放在某个地方,并在用户登录时调用它,例如使用Wiki上提到的awesome和run_once函数。任何方法都可以,因为如果调用函数的次数比要求的次数多,不会造成损害。
#!/bin/sh
touch $HOME/.dbus/Xdbus
chmod 600 $HOME/.dbus/Xdbus
env | grep DBUS_SESSION_BUS_ADDRESS > $HOME/.dbus/Xdbus
echo 'export DBUS_SESSION_BUS_ADDRESS' >> $HOME/.dbus/Xdbus
exit 0
这将创建一个包含所需Dbus环境变量的文件。然后在cron调用的脚本中,通过采购脚本导入变量:
if [ -r "$HOME/.dbus/Xdbus" ]; then
. "$HOME/.dbus/Xdbus"
fi
答案 6 :(得分:0)
最后是丑陋的,一点也没有cron(该死)!使用其他方法,可以在gconf中设置更改,但图像不会更改。可能是因为我正在运行Deepin的DDE(dde使用相同的路径,不同的密钥)。为营救而丑陋:最终使这个传奇成功的尝试。
使用此脚本,墙纸每隔420秒(7分钟)进行无休止的循环更改,从4组(或目录)之一中随机选择墙纸,以适应白天或黑夜的时间。
我创建了一个.desktop文件,并将此.desktop文件添加到“〜/ .config / autostart” 中。我还创建了另一个配对脚本/桌面,但没有将循环放在我的基座上,因此我也可以单击它并即时更改它。
设置丑陋:将脚本另存为墙纸并使其可执行:
chmod + x贴墙纸
现在在 Pictures 目录中创建一个名为墙纸的文件夹。在此Wallpaper文件夹内,再创建4个文件夹,名称分别为下午,黄昏黎明,早晨和夜晚。将所需的图像文件放在这四个目录中。
mkdir -p〜/图片/墙纸/早晨
mkdir〜/图片/墙纸/下午
mkdir〜/图片/墙纸/晚
mkdir〜/图片/墙纸/黄昏黎明
#!/bin/bash
for (( ; ; ))
do
me="MyUser" # Change me!
morning="morning"
afternoon="afternoon"
dawn="duskdawn"
night="night"
dusk="duskdawn"
now="morning"
hour=$(date +%R | sed 's/\:.*//')
if [ "$hour" -ge 7 ] && [ "$hour" -lt 12 ]
then
now="morning"
elif [ "$hour" -ge 12 ] && [ "$hour" -lt 17 ]
then
now="afternoon"
elif [ "$hour" -ge 17 ] && [ "$hour" -lt 18 ]
then
now="duskdawn"
elif [ "$hour" -ge 18 ] && [ "$hour" -le 23 ]
then
now="night"
elif [ "$hour" -ge 0 ] && [ "$hour" -lt 6 ]
then
now="night"
elif [ "$hour" -ge 6 ] && [ "$hour" -lt 7 ]
then
now="duskdawn"
fi
imgPath="/home/$me/Pictures/Wallpaper/$now/"
imgFile=$(ls -1 $imgPath | shuf -n 1 | awk '{print $NF}')
export bgNow=""$imgPath$imgFile""
# Deepin desktop
/usr/bin/gsettings set com.deepin.wrap.gnome.desktop.background picture-uri "$bgNow"
# Gnome desktop
#/usr/bin/gsettings set org.gnome.desktop.background picture-uri "$bgNow"
sleep 420
done
**自动启动路径:/home/YOUR_USER/.config/autostart/wallyd.desktop **
[Desktop Entry]
Categories=System;
Comment=Change Wallpapers Agent
Exec=/home/$USER/Bin/wallpaperd
Icon=computer
Name=Wally Daemon
NoDisplay=false
Terminal=false
Type=Application
要创建一个没有循环的桌面图标,只需更改背景墙并退出即可:
将脚本另存为墙纸(末尾没有d)并删除以下行:
for (( ; ; ))
do
done
使用上面的模板为该非循环墙纸脚本创建另一个.desktop文件。更改非循环脚本的名称和 Exec 路径。
在此处保存此.desktop:
/usr/share/applications/wally.desktop
将其拖动到任务栏或停靠。单击它,它将动态更改壁纸。