[英]Gsettings with cron
我寫了一個 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
經過多次嘗試,我終於設法解決了這個問題。
事實上,這個問題的發生是因為 cron 只使用了一組非常有限的環境變量。 唯一一個負責以正確方式運行問題腳本的環境變量是DBUS_SESSION_BUS_ADDRESS
,而不是DISPLAY
或XAUTHORITY
或GSETTINGS_BACKEND
或其他東西。 在這個答案中也很好地指出了這一事實。
但是這個答案中的問題是無法保證~/.dbus/session-bus/
目錄中該文件中的DBUS_SESSION_BUS_ADDRESS
變量更新為當前 gnome 會話的當前值。 要解決這個問題,一種方法是在當前 gnome 會話中找到進程的 PID,並從其環境中獲取 dbus 地址。 我們可以這樣做:
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-)
話雖如此,腳本應該如下所示:
#!/bin/bash
# TODO: At night only dark wallpapers.
# Wallpaper's directory.
dir="${HOME}/images/wallpapers/"
# export DBUS_SESSION_BUS_ADDRESS environment variable
PID=$(pgrep gnome-session)
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ|cut -d= -f2-)
# 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}"
我找到了一些解決方案。 當您導出文件 ~/.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}"
試過這個,它對我很有用:
dbus-launch --exit-with-session gsettings set schema key value
或者從根 cron:
sudo -u user dbus-launch --exit-with-session gsettings set schema key value
添加 export DISPLAY=:0 && export XAUTHORITY=/home/username/.Xauthority ,其中 username 是您的 ubuntu 用戶名。 它應該修復 X11 授權錯誤。
要通過 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 設置 org.gnome.desktop.background 圖片-uri file:////home/elison/Pictures/noon.jpg
另請參閱此對我有用的解決方案: https : //unix.stackexchange.com/questions/111188/using-notify-send-with-cron#answer-111190 :
您需要設置 DBUS_SESSION_BUS_ADDRESS 變量。 默認情況下,cron 無權訪問該變量。 為了解決這個問題,將以下腳本放在某處並在用戶登錄時調用它,例如使用 awesome 和 wiki 上提到的 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
最后是丑陋的,根本沒有 cron(該死的)! 使用其他方法在 gconf 中設置更改,但圖像不會更改。 可能是因為我運行的是Deepin的DDE(dde使用的是同一個路徑,不同的key)。 丑陋的救援:使這個傳奇成功的最后一次嘗試。
使用此腳本,牆紙每 420 秒(7 分鍾)更改一次,無限循環地根據白天或晚上的時間從 4 組(或目錄)之一中隨機選擇牆紙。
我創建了一個 .desktop 文件並將這個 .desktop 文件添加到"~/.config/autostart" 。 我還創建了另一對腳本/桌面,沒有循環在我的 Dock 上,所以我可以點擊它並即時更改它。
設置丑陋:將腳本保存為牆紙並使其可執行:
chmod +x 壁紙
現在在圖片目錄中創建一個名為牆紙的文件夾。 在此牆紙文件夾中,再創建 4 個文件夾,名稱分別為下午、黃昏、早晨和晚上。 將您想要的圖像文件放在這 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
要創建沒有循環的桌面圖標,只需更改 wally 並退出,請執行以下操作:
將腳本另存為牆紙(末尾沒有 d)並刪除這些行:
for (( ; ; ))
do
done
使用上面的模板為這個非循環牆紙腳本創建另一個 .desktop 文件。 更改非循環腳本的名稱和執行路徑。
在此處保存此 .desktop:
/usr/share/applications/wally.desktop
將其拖到任務欄或停靠欄。 單擊它,它將動態更改牆紙。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.