2012-04-29 14 views
20

Escribí un script bash que cambia el fondo de pantalla (para GNOME3).Gsettings con cron

#!/bin/bash 

# Wallpaper's 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}" 

La secuencia de comandos ejecutada en un emulador de terminal (por ejemplo, gnome-terminal) funciona muy bien. Durante la ejecución por cron, o el terminal ttyX obteniendo el error:

** (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 
+0

Ninguno de la solución que funcionó para mí. :(Tuve que configurar DISPLAY =: 0.0 antes del comando en la expresión de cron. (Http://ubuntuforums.org/showthread.php?t=1023215). Ps Estoy intentando ejecutar un script de python que usa pynotify. – Hussain

+0

@ Hussain: Tomó un tiempo desde que comencé la pregunta. Apuesto a que la respuesta debajo de la mía debería ser mejor. Solo lea toda la discusión. –

Respuesta

6

Encontré algunas soluciones. Cuando exporta una variable DBUS_SESSION_BUS_ADDRESS contenida en el archivo ~/.dbus/session-bus/*, dbus-launch no dice más sobre el error. Sin embargo, en lugar de fondo de pantalla hay artefactos.

Agregado código:

sessionfile=`find "${HOME}/.dbus/session-bus/" -type f` 
export `grep "DBUS_SESSION_BUS_ADDRESS" "${sessionfile}" | sed '/^#/d'` 

Ahora el guión es el siguiente:

#!/bin/bash 

# TODO: At night only dark wallpapers. 

# Wallpaper's 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}" 
0

Para cambiar el fondo de pantalla a través de cron, acaba de hacer esto directamente en su crontab: crontab -e Ejecutar

Agregue líneas como esta:

30 09 * * * DIS PLAY =: 0 GSETTINGS_BACKEND = dconf/usr/bin/gsettings set org.gnome.desktop.background picture-uri file: ////home/elison/Pictures/morning.jpg

00 12 * * * DISPLAY = : 0 GSETTINGS_BACKEND = dconf/usr/bin/gsettings set org.gnome.desktop.background picture-uri file: ////home/elison/Pictures/noon.jpg

4

Intenté esto y me funcionó muy bien:

dbus-launch --exit-with-session gsettings set schema key value 

O desde cron root:

sudo -u user dbus-launch --exit-with-session gsettings set schema key value 

Crédito: http://php.mandelson.org/wp2/?p=565

+0

No me pasa nada, simplemente no hay error que muestre – Sergey

+0

¡Gracias! – grigio

+0

Hay un problema con esto si úselo en una sesión interactiva (por ejemplo, 'ssh') y hay una sesión X11 separada ejecutándose en el sistema, parece causar algún tipo de desaceleración o captura de teclas hasta que la sesión finalice. La página de manual para' dbus' versión 1.8 .18 indica: "Para iniciar una sesión de D-Bus dentro de un texto \\ (hymode session, no use dbus-launch. En su lugar, vea ** dbus-run-session ** (1)." (Creo que lo extraño '\ (' cosa es un error de formateo.) Desafortunadamente, parece que 'dbus-run-session' es bastante nuevo, ya que está en Debian 8 pero no en Debian 7. –

0

añadir export DISPLAY =: 0 & & XAUTHORITY exportación =/home/usuario/.Xauthority, donde nombre de usuario es su nombre de usuario ubuntu. Debería corregir el error de autorización X11.

35

Finalmente me las arreglé para resolver este problema después de muchos, muchos intentos.

De hecho, el problema ocurre porque cron usa solo un conjunto muy restringido de variables de entorno. Y la única variable de entorno que es responsable de ejecutar correctamente el script de la pregunta cuando se configura como un trabajo cron es DBUS_SESSION_BUS_ADDRESS, no DISPLAY o XAUTHORITY o GSETTINGS_BACKEND o algo más. Este hecho también se señaló bien en this answer.

Pero el problema es que en this answerno hay garantía de que la variableDBUS_SESSION_BUS_ADDRESS de ese archivo de ~/.dbus/session-bus/ directorio se actualiza al valor actual de la sesión de GNOME actual. Para repasar este problema, un método sería encontrar el PID de un proceso en la sesión gnome actual y obtener la dirección dbus de su entorno.Podemos hacer esto de la siguiente manera:

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-) 

Dicho esto, el guión debe verse como:

#!/bin/bash 

# TODO: At night only dark wallpapers. 

# Wallpaper's 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}" 
+3

Muchas gracias. Tengo un script que actualiza mi fondo de escritorio a medianoche. Este script dejó de funcionar correctamente hace algunos meses. Cuando lo lancé normalmente, funcionó, pero desde crontab no funcionó. Con este truco podría resolver el problema. – Jabba

+2

Para monitores de pantalla doble, cambie la opción 'spanned' por' zoom' – Coconop

+0

Gracias por esta solución. Tuve que modificarlo ligeramente para trabajar con gnome-shell en Debian: 'PID = $ (pgrep -o gnome-shell)'. – scai