web-dev-qa-db-ja.com

Cronは背景を正常に変更できません

時刻に基づいて変化するカスタム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として実行しないでください。

7
Solenoid

明らかに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/
10
perdigueiro

これは、cronが使用する環境変数のセットが非常に制限されているためです。これがcronジョブとして設定されている場合、質問からのスクリプトを正しい方法で実行する唯一の環境変数は、DISPLAYDBUS_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
7
Radu Rădeanu

私は約一ヶ月前に同じ問題を抱え始めました。 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

「このバグはあなたに影響しますか?」をクリックしてください。同じ問題がある場合はリンクしてください。

0
Serrano