Я использую 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.
Очевидно, 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/
Я начал иметь ту же проблему приблизительно месяц назад. Я также создал сценарий, который использует 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
Нажмите "На эту ошибку, влияет на Вас?" свяжитесь, если у Вас есть та же проблема.
Это происходит потому, что 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