web-dev-qa-db-ja.com

cronを設定してシェルスクリプトを実行する:Webページからのランダムな壁紙

Webページからランダムな壁紙をダウンロードし、5時間ごとに背景として設定するシェルスクリプトを作成しました。スクリプトは次のとおりです。

#!/bin/bash

countervar=1;
finish=0;
cd /home/guinness/.rwallpaper/
if [ -f counter ]
then
    countervar=`cat counter`
fi

for (( i=$countervar; c<=2000000; i++ ))
do
   echo $i > "counter"
   if [ ! -f wallpaper-$i.jpg ]
   then
    wget "http://wallpapers.wallbase.cc/rozne/wallpaper-$i.jpg"

    if [ -f wallpaper-$i.jpg ]
    then
        gsettings set org.gnome.desktop.background picture-uri "file:///home/guinness/.rwallpaper/wallpaper-$i.jpg"
        exit
    fi
   fi
done

このスクリプトを実行すると、魅力のように機能します。 cronを使用して、5時間ごとにこれを実行します。問題は、5時間ごとに実行され、次の画像が正常にダウンロードされるが、壁紙として設定されないことです。誰が問題になるのか教えてもらえますか?

2
DalekSupreme

これは、cronが使用する環境変数のセットが非常に制限されているためです。これがcronジョブとして設定されている場合、質問からのスクリプトを正しい方法で実行する責任がある唯一の環境変数はDBUS_SESSION_BUS_ADDRESSです。

そのため、スクリプトのDBUS_SESSION_BUS_ADDRESS環境変数をエクスポートする必要があります。私の答えの詳細な説明を参照してください こちら

最終的に、スクリプトは次のようになります。

#!/bin/bash

PID=$(pgrep gnome-session)
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ|cut -d= -f2-)

countervar=1;
finish=0;
cd /home/guinness/.rwallpaper/
if [ -f counter ]
then
    countervar=`cat counter`
fi

for (( i=$countervar; c<=2000000; i++ ))
do
   echo $i > "counter"
   if [ ! -f wallpaper-$i.jpg ]
   then
    wget "http://wallpapers.wallbase.cc/rozne/wallpaper-$i.jpg"

    if [ -f wallpaper-$i.jpg ]
    then
        gsettings set org.gnome.desktop.background picture-uri "file:///home/guinness/.rwallpaper/wallpaper-$i.jpg"
        exit
    fi
   fi
done
4
Radu Rădeanu

直面している問題は、スクリプトのバックグラウンド切り替え部分がXセッションの環境変数に依存していることです。 Cronは環境変数を設定しないため、スクリプトのこの部分が破損します。

この問題を回避するには、約5時間のスリープでスクリプトをwhileループに入れてから、/ etc/X11/Xsession.d/my_scriptまたは〜/ .xprofileなどの場所にスクリプトを呼び出します。

1
xyrix