簡體   English   中英

帶有 cron 的 Gsettings

[英]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 ,而不是DISPLAYXAUTHORITYGSETTINGS_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

信用: http : //php.mandelson.org/wp2/?p=565

添加 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
  • 在腳本中為您的桌面設置正確的 gsettings 命令!

wallyd.desktop

** 自動啟動路徑:/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM