job - linux log cron
Gsettings con cron (6)
Encontré algunas soluciones. Cuando exporta una variable DBUS_SESSION_BUS_ADDRESS contenida en el archivo ~ / .dbus / session-bus / *, dbus-launch no informa más acerca del error. Sin embargo, en lugar de papel tapiz hay artefactos.
Código añadido:
sessionfile=`find "${HOME}/.dbus/session-bus/" -type f`
export `grep "DBUS_SESSION_BUS_ADDRESS" "${sessionfile}" | sed ''/^#/d''`
Ahora el guión se ve así:
#!/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}"
Escribí un script de bash que cambia el fondo de pantalla (para GNOME3).
#!/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}"
El script ejecutado en un emulador de terminal (por ejemplo, gnome-terminal) funciona muy bien. Durante la ejecución por cron, o 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
Finalmente logré resolver este problema después de muchos, muchos intentos.
De hecho, el problema ocurre porque cron utiliza 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 alguna otra cosa. Este hecho también fue bien señalado en esta respuesta .
Pero el problema en esta respuesta es que no hay garantía de que la variable DBUS_SESSION_BUS_ADDRESS
de ese archivo de ~/.dbus/session-bus/
directory se actualice al valor actual de la sesión actual de gnome. Para resolver este problema, un método sería encontrar el PID de un proceso en la sesión actual de gnome 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 debería 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}"
Intenté esto y funcionó muy bien para mí:
dbus-launch --exit-with-session gsettings set schema key value
O desde la raíz cron:
sudo -u user dbus-launch --exit-with-session gsettings set schema key value
Crédito: http://php.mandelson.org/wp2/?p=565
Para cambiar su fondo de pantalla a través de cron, simplemente haga esto directamente en su crontab: Ejecute crontab -e
Añade líneas como esta:
30 09 * * * DISPLAY =: 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
También vea esta solución que me funcione: https://unix.stackexchange.com/questions/111188/using-notify-send-with-cron#answer-111190 :
Debe establecer la variable DBUS_SESSION_BUS_ADDRESS. Por defecto cron no tiene acceso a la variable. Para remediar esto, ponga el siguiente script en alguna parte y llámelo cuando el usuario inicie sesión, por ejemplo, usando awesome y la función run_once mencionada en la wiki. Cualquier método funcionará, ya que no daña si la función se llama con más frecuencia de la requerida.
#!/bin/sh
touch $HOME/.dbus/Xdbus
chmod 600 $HOME/.dbus/Xdbus
env | grep DBUS_SESSION_BUS_ADDRESS > $HOME/.dbus/Xdbus
echo ''export DBUS_SESSION_BUS_ADDRESS'' >> $HOME/.dbus/Xdbus
exit 0
Esto crea un archivo que contiene la variable de entorno de Dbus requerida. Luego, en la secuencia de comandos llamada por cron, importa la variable mediante la fuente de la secuencia de comandos:
if [ -r "$HOME/.dbus/Xdbus" ]; then
. "$HOME/.dbus/Xdbus"
fi
agregar export DISPLAY =: 0 && exportar XAUTHORITY = / home / username / .Xauthority, donde username es tu nombre de usuario de Ubuntu. Debe arreglar el error de autorización X11.