時刻に基づいて変化するカスタム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
Cronはgsettings
にアクセスできませんか?ジョブはユーザーcrontabにあるため、rootとして実行しないでください。
明らかにgsettings
にはいくつかの変数を設定する必要があります。 CRONは非常に制限された環境変数セットのみを使用するため、スクリプトの前にそれらを設定する必要があります。 CRON行で次のコードを使用します。
30 */2 * * * DISPLAY=:0 GSETTINGS_BACKEND=dconf /your/path/your-script.sh
この例では、ジョブは30分に2時間ごとに実行されるように設定されています。行をきれいにするために変数をスクリプトに挿入しようとしましたが、結果はありません。誰かがそれを行う方法を見つけたら、お知らせください。
ArchLinuxフォーラム でこれらの設定につまずきました。
上記のソリューションはVividで動作しなくなりました。
これを機能させる最良の方法は、DBUS_SESSION_BUS_ADDRESS
変数を見つけることです。次のスクリプトでは、gnome-session
のような特定のアプリケーションのfor
を使用していないため、pidof
ループを使用してジョブを実行しています私のために常に動作し、新しいアプリケーションは異なる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/
これは、cronが使用する環境変数のセットが非常に制限されているためです。これがcronジョブとして設定されている場合、質問からのスクリプトを正しい方法で実行する唯一の環境変数は、DISPLAY
やDBUS_SESSION_BUS_ADDRESS
などではなく、GSETTINGS_BACKEND
です。
そのため、スクリプトのDBUS_SESSION_BUS_ADDRESS
環境変数をエクスポートする必要があります。私の答えの詳細な説明を参照してください here 。
最終的に、スクリプトは次のようになります。
#!/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
私は約一ヶ月前に同じ問題を抱え始めました。 Gnome Shell/Unityでデスクトップの背景を変更するためにgsettings
を使用するスクリプトも作成しました。
このコマンドを手動で実行すると、デスクトップの背景がすぐに更新されます。また、cronを使用してスクリプトの実行をスケジュールします。
0,30 * * * * DISPLAY=:0.0 nextwall /home/serrano/Pictures/backgrounds/
あなたの場合のように、cronはスクリプトを正常に実行し、新しい壁紙URIはgsettings
に正常に設定されます。これをテストするには、次を実行します。
gsettings get org.gnome.desktop.background picture-uri
ただし、cronがスクリプトを実行してもデスクトップの背景は更新されません(これは約1か月前まで機能していました)。興味深いことに、デスクトップを右クリックして[デスクトップの背景を変更]を選択すると、デスクトップの背景が突然正しい画像に更新されます。
そのため、何らかの理由でデスクトップの背景をcronから変更しても、Nautilusはデスクトップの背景を更新しません。これはバグだと思うので、この問題のバグレポートを提出しました。 https://bugs.launchpad.net/ubuntu/+source/nautilus/+bug/1033034
「このバグはあなたに影響しますか?」をクリックしてください。同じ問題がある場合はリンクしてください。