Подтвердить что ты не робот

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
4b9b3361

Ответ 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.