Gsettings cron
Я написал bash script, который меняет обои (для GNOME3).
#!/bin/bash
# Wallpaper directory.
dir="${HOME}/images/wallpapers/"
# Random wallpaper.
wallpaper=`find "${dir}" -type f | shuf -n1`
# Change wallpaper.
# http://bit.ly/HYEU9H
gsettings set org.gnome.desktop.background picture-options "spanned"
gsettings set org.gnome.desktop.background picture-uri "file://${wallpaper}"
Script, выполняемый в терминальном эмуляторе (например, гном-терминал), отлично работает. Во время выполнения cron, или ttyX-терминал получает ошибку:
** (process:26717): WARNING **: Command line `dbus-launch --autolaunch=d64a757758b286540cc0858400000603 --binary-syntax --close-stderr' exited with non-zero exit status 1: Autolaunch error: X11 initialization failed.\n
** (process:26717): WARNING **: Command line `dbus-launch --autolaunch=d64a757758b286540cc0858400000603 --binary-syntax --close-stderr' exited with non-zero exit status 1: Autolaunch error: X11 initialization failed.\n
** (process:26721): WARNING **: Command line `dbus-launch --autolaunch=d64a757758b286540cc0858400000603 --binary-syntax --close-stderr' exited with non-zero exit status 1: Autolaunch error: X11 initialization failed.\n
** (process:26721): WARNING **: Command line `dbus-launch --autolaunch=d64a757758b286540cc0858400000603 --binary-syntax --close-stderr' exited with non-zero exit status 1: Autolaunch error: X11 initialization failed.\n
Ответы
Ответ 1
Наконец, мне удалось решить эту проблему после многих попыток.
Действительно, проблема возникает из-за того, что cron использует только очень ограниченный набор переменных среды. И единственная переменная среды, которая отвечает за правильную работу script из вопроса, когда это задано как задание cron, это DBUS_SESSION_BUS_ADDRESS
, а не DISPLAY
или XAUTHORITY
или GSETTINGS_BACKEND
или что-то еще, Этот факт также был хорошо отмечен в этом ответе.
Но проблема в этом ответе заключается в том, что нет гарантии, что переменная DBUS_SESSION_BUS_ADDRESS
из этого файла из каталога ~/.dbus/session-bus/
будет обновлена до текущего значения из текущий сеанс gnome. Чтобы решить эту проблему, метод должен найти PID процесса в текущем сеансе gnome и получить адрес dbus из его среды. Мы можем сделать это следующим образом:
PID=$(pgrep gnome-session) # instead of 'gnome-session' it can be also used 'noutilus' or 'compiz' or the name of a process of a graphical program about that you are sure that is running after you log in the X session
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ|cut -d= -f2-)
При этом script должен выглядеть так:
#!/bin/bash
# TODO: At night only dark wallpapers.
# Wallpaper directory.
dir="${HOME}/images/wallpapers/"
# export DBUS_SESSION_BUS_ADDRESS environment variable
PID=$(pgrep gnome-session)
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ|cut -d= -f2-)
# Random wallpaper.
wallpaper=`find "${dir}" -type f | shuf -n1`
# Change wallpaper.
# http://bit.ly/HYEU9H
gsettings set org.gnome.desktop.background picture-options "spanned"
gsettings set org.gnome.desktop.background picture-uri "file://${wallpaper}"
Ответ 2
Я нашел несколько решений. Когда вы экспортируете переменную DBUS_SESSION_BUS_ADDRESS, содержащуюся в файле ~/.dbus/session-bus/*, dbus-запуск больше не сообщает об ошибке. Однако вместо обоев есть артефакты.
Добавлен код:
sessionfile=`find "${HOME}/.dbus/session-bus/" -type f`
export `grep "DBUS_SESSION_BUS_ADDRESS" "${sessionfile}" | sed '/^#/d'`
Теперь script выглядит так:
#!/bin/bash
# TODO: At night only dark wallpapers.
# Wallpaper directory.
dir="${HOME}/images/wallpapers/"
# Weird, but necessary thing to run with cron.
sessionfile=`find "${HOME}/.dbus/session-bus/" -type f`
export `grep "DBUS_SESSION_BUS_ADDRESS" "${sessionfile}" | sed '/^#/d'`
# Random wallpaper.
wallpaper=`find "${dir}" -type f | shuf -n1`
# Change wallpaper.
# https://superuser.com/questions/298050/periodically-changing-wallpaper-under-gnome-3/298182#298182
gsettings set org.gnome.desktop.background picture-options "spanned"
gsettings set org.gnome.desktop.background picture-uri "file://${wallpaper}"
Ответ 3
Пробовал это, и он отлично поработал у меня:
dbus-launch --exit-with-session gsettings set schema key value
Или из корневого cron:
sudo -u user dbus-launch --exit-with-session gsettings set schema key value
Кредит: http://php.mandelson.org/wp2/?p=565
Ответ 4
Чтобы изменить обои через cron, просто сделайте это прямо в своем crontab:
Выполнить crontab -e
Добавьте строки, подобные этому:
30 09 * * * DISPLAY =: 0 GSETTINGS_BACKEND = dconf/usr/bin/gsettings set org.gnome.desktop.background файл-uri:////home/elison/Pictures/morning.jpg
00 12 * * * DISPLAY =: 0 GSETTINGS_BACKEND = dconf/usr/bin/gsettings set org.gnome.desktop.background файл-uri:////home/elison/Pictures/noon.jpg
Ответ 5
добавить экспорт DISPLAY =: 0 && & export XAUTHORITY =/home/username/.Xauthority, где username - ваше имя пользователя ubuntu. Он должен исправить ошибку авторизации X11.