Настройка cron для запуска сценария оболочки: случайные обои с веб-страницы

Я написал сценарий оболочки, который загружает случайные обои с веб-страницы и устанавливает их в качестве фона каждые 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
задан 04.05.2020, 02:07

2 ответа

Это происходит потому, что 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
ответ дан 04.05.2020, 02:09

Проблема, с которой вы сталкиваетесь, почти наверняка состоит в том, что часть переключения сценария в фоновом режиме зависит от переменных среды вашего сеанса X. Cron не устанавливает никаких переменных окружения, поэтому это нарушит эту часть скрипта.

Чтобы обойти эту проблему, вы можете поместить скрипт в цикл while со сном около пяти часов, а затем позвонить и поместить скрипт в такое место, как /etc/X11/Xsession.d/my_script или ~ / .xprofile.

1
ответ дан 04.05.2020, 02:08
  • 1
    ~/.xprofile и/etc/X11/Xsession.d/xxx оба выполняются автоматически, таким образом, Вы won' t должны запустить сценарий вручную. Можно выполнить сценарий в фоновом режиме путем добавления " & " в ударе. Так, в Вашем ~/.xprofile Вы может добавить строку: " в то время как верный; сделайте/path/to/my_script; сон 999999; сделанный & " И это будет выполнять Ваш сценарий один раз в так часто. – user1389723 04.05.2020, 02:08
  • 2
    Я думал об этом решении, но привычка функция сна останавливает целый поток?. И кроме того я don' t действительно хочу запустить сценарий вручную каждый раз, когда я включаю компьютер. Таким образом, эта проблема возникнет, если я установил этот сценарий как программу запуска? – web_bod 04.05.2020, 02:09

Теги

Похожие вопросы