Cron kann den Hintergrund nicht erfolgreich ändern

7

Ich verwende 12.04 mit einem benutzerdefinierten XML-Hintergrund (Änderung am Tag von Ubuntu), der sich je nach Tageszeit ändert. Ich habe festgestellt, dass es eine erhebliche Verzögerung zwischen dem geplanten Zeitpunkt für die Änderungen in der XML-Datei und dem tatsächlichen Erscheinen im Hintergrund gibt. Ich habe auch festgestellt, dass ich beim Fortsetzen von Suspend auch nicht das richtige Hintergrundbild erhalte. Ich habe festgestellt, dass das manuelle Durchlaufen des Hintergrundbilds dieses Problem behebt, und ich habe ein Skript geschrieben, um den Prozess zu automatisieren.

Wenn ich das Skript manuell ausführe, funktioniert es einwandfrei. Wenn ich jedoch plane, dass das Skript in cron ausgeführt wird, ändert cron den Hintergrund nicht. Um sicherzustellen, dass das Skript von cron ordnungsgemäß ausgeführt wurde, ließ ich es nach dem Ausführen der Hintergrundänderung ein Verzeichnis in meinem Basisordner erstellen. Das Verzeichnis wurde erfolgreich erstellt, sodass ich weiß, dass cron das Skript ausführt und ausführt.

Mein Skript:

#!/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

Kann cron einfach nicht darauf zugreifen gsettings? Der Job befindet sich auf meinem Benutzer crontab, daher sollte er nicht als root ausgeführt werden.

Magnet
quelle

Antworten:

10

Anscheinend gsettingsmüssen einige Variablen gesetzt werden. Da CRON nur einen sehr eingeschränkten Satz von Umgebungsvariablen verwendet, müssen Sie diese vor Ihrem Skript festlegen. Verwenden Sie den folgenden Code in Ihrer CRON-Zeile.

30 */2 * * * DISPLAY=:0 GSETTINGS_BACKEND=dconf /your/path/your-script.sh

In diesem Beispiel wird der Job in der 30. Minute alle 2 Stunden ausgeführt. Ich habe versucht, die Variablen für eine sauberere Zeile in das Skript einzufügen, ohne Ergebnis. Wenn jemand einen Weg findet, dies zu tun, lassen Sie es uns wissen.

Stolperte mit diesen Einstellungen in ArchLinux-Foren .

Die obige Lösung funktioniert nicht mehr mit Vivid .

Der beste Weg, um dies zum Laufen zu bringen DBUS_SESSION_BUS_ADDRESS, besteht in der Tat darin, eine Variable zu finden . Im folgenden Skript verwende ich eine forSchleife, um die Arbeit zu erledigen, da die Verwendung pidofeiner bestimmten Anwendung wie gnome-sessionnicht immer für mich funktioniert und die neueren Anwendungen DBUS ADDRESSwahrscheinlich eine andere haben weil ich in meinem speziellen Fall einige Daemons beim Booten mit meinem Benutzernamen starte. Um das von mir verwendete Hintergrundbild effektiv zu ändern dconf, können Sie es aber auch verwenden gsettings. Passen Sie das Skript also an Ihren Anwendungsfall an.

#!/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

Fügen Sie in crontab die folgende Zeile hinzu, um das Hintergrundbild jede gerade Stunde zu ändern

0 */2 * * * /path/to-above-script.sh /path/to-wallpapers/
perdigueiro
quelle
7

Dies liegt daran, dass cron nur einen sehr eingeschränkten Satz von Umgebungsvariablen verwendet. Die einzige Umgebungsvariable, die dafür verantwortlich ist, dass das Skript aus der Frage, wenn dies als Cron-Job festgelegt ist DBUS_SESSION_BUS_ADDRESS, richtig ausgeführt wird , ist nicht DISPLAYoder GSETTINGS_BACKENDoder etwas anderes.

Sie müssen also DBUS_SESSION_BUS_ADDRESSUmgebungsvariablen in Ihr Skript exportieren . Weitere Erklärungen finden Sie in meiner Antwort hier .

Am Ende sollte Ihr Skript folgendermaßen aussehen:

#!/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
Radu Rădeanu
quelle
3
die einzig richtige Antwort ...
Stefanos Kalantzis
3
Ich wünschte, ich hätte dies vor etwa 90 Minuten gefunden
Mark
2
Wenn sich andere Benutzer bei ihrem Computer anmelden, empfehle ich die Verwendung PID=$(pgrep -u $USER gnome-session), um zu vermeiden, dass sich die Hintergründe anderer ändern.
Raab70
@ Raab70 Ich habe dies unter Linux Mint getestet und die Variable $ USER scheint in einem Crontab-Job nicht verfügbar zu sein. (Auch bei Mint ist der Prozess, für den pgrep verwendet werden soll, eine Zimtsitzung mit dem Flag -f aufgrund der Länge des Prozessnamens.)
SimonT
0

Ich hatte vor ungefähr einem Monat das gleiche Problem. Ich habe auch ein Skript erstellt, mit gsettingsdem der Desktop-Hintergrund in Gnome Shell / Unity geändert wird.

Durch manuelles Ausführen dieses Befehls wird der Desktop-Hintergrund sofort aktualisiert. Ich verwende cron auch, um die Ausführung meines Skripts zu planen:

0,30 * * * * DISPLAY=:0.0 nextwall /home/serrano/Pictures/backgrounds/

Wie in Ihrem Fall führt cron das Skript erfolgreich aus und der neue Hintergrund-URI wurde erfolgreich eingerichtet gsettings. Sie können dies testen, indem Sie Folgendes ausführen:

gsettings get org.gnome.desktop.background picture-uri

Der Desktop-Hintergrund wird jedoch nicht aktualisiert, wenn cron das Skript ausführt (dies funktionierte bis vor etwa einem Monat). Interessanterweise wird der Desktop-Hintergrund plötzlich auf das richtige Bild aktualisiert, wenn ich mit der rechten Maustaste auf meinen Desktop klicke und "Desktop-Hintergrund ändern" auswähle.

Aus irgendeinem Grund veranlasst das Ändern des Desktop-Hintergrunds von cron Nautilus nicht mehr, den Desktop-Hintergrund zu aktualisieren. Ich vermute, dass dies ein Fehler ist, daher habe ich gerade einen Fehlerbericht für dieses Problem eingereicht: https://bugs.launchpad.net/ubuntu/+source/nautilus/+bug/1033034

Bitte klicken Sie auf "Betrifft Sie dieser Fehler?" Link, wenn Sie das gleiche Problem haben.

Serrano
quelle