Cron не может успешно изменить фон

Я использую 12.04 с пользовательским фоном XML (модификация в Day of Ubuntu), который меняется в зависимости от времени суток. Я заметил, что существует значительная задержка между тем, когда изменения запланированы для внесения в файл 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
задан 30 October 2013 в 12:02

3 ответа

Очевидно, gsettings необходимо установить некоторые переменные. Поскольку CRON использует только очень ограниченный набор переменных среды, вы должны установить их перед сценарием. Используйте следующий код в своей строке CRON.

30 */2 * * * DISPLAY=:0 GSETTINGS_BACKEND=dconf /your/path/your-script.sh

В этом примере задание запускается каждые 2 часа на 30-й минуте. Я попытался вставить переменные в скрипт, для более чистой строки, но безрезультатно, если кто-то найдет способ сделать это, дайте нам знать.

С этими настройками сталкивались на форумах ArchLinux .

Приведенное выше решение больше не работает с Vivid .

Лучший способ заставить это работать - это найти переменную DBUS_SESSION_BUS_ADDRESS, в следующем скрипте я использую цикл for для выполнения этой работы, потому что использую pidof определенного приложения, такого как gnome-session не всегда работает для меня, и более новые приложения имеют другое 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/
0
ответ дан 30 October 2013 в 12:02

Я начал иметь ту же проблему приблизительно месяц назад. Я также создал сценарий, который использует gsettings изменить настольные знания в Gnome Shell/Единица.

Вручную выполнение этой команды сразу обновляет настольный фон. Я также использую крон для планирования выполнения моего сценария:

0,30 * * * * DISPLAY=:0.0 nextwall /home/serrano/Pictures/backgrounds/

Как в Вашем случае, крон успешно запускает скрипт и новые обои, в которых успешно установлен URI gsettings. Можно протестировать это путем выполнения:

gsettings get org.gnome.desktop.background picture-uri

Однако настольный фон не обновляется, когда крон запускает скрипт (это раньше работало до приблизительно месяц назад). Интересно, когда я щелкаю правой кнопкой по своему рабочему столу, и выбор "Изменяют Настольный Фон", настольный фон внезапно обновляется к правильному образу.

Таким образом, по некоторым причинам изменение настольного фона от крона больше не инициировало Наутилус для обновления настольного фона. Я подозреваю, что это - ошибка, таким образом, я просто зарегистрировал отчет об ошибках для этой проблемы: https://bugs.launchpad.net/ubuntu / + источник/наутилус / + ошибка/1033034

Нажмите "На эту ошибку, влияет на Вас?" свяжитесь, если у Вас есть та же проблема.

0
ответ дан 30 October 2013 в 12:02

Это происходит потому, что cron использует только очень ограниченный набор переменных окружения. Единственная переменная окружения, которая отвечает за правильное выполнение скрипта из вопроса, когда это задано как задание cron, это DBUS_SESSION_BUS_ADDRESS, а не DISPLAY или GSETTINGS_BACKEND или что-то еще.

Итак, вы должны экспортировать 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-)

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
0
ответ дан 30 October 2013 в 12:02

Другие вопросы по тегам:

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