notify-send aus cronjob

09/05/2011 - 12:37 von Jakobus Schuerz | Report spam
Hi Leute!

Ich hab grad notify-send für mich entdeckt. :-) Für manche Geschichten
ist das doch recht praktisch. Nur hab ich ein Problem. Ich mache meine
Datensicherung regelmàssig per rsnapshot auf eine externe Platte als
root und per cronjob. Und ich würde gerne den Beginn und das Ende der
Datensicherung per notify-send auf meinem Desktop signalisiert haben.
Das Problem ist, es tut nicht. Rufe ich notify-send von einem Xterm als
root auf, dann bekomme ich die Meldung auch angezeigt. Aus einem cronjob
nicht.

Ich habe bisher gelesen, dass ich vorher die Variable DISPLAY=:0.0
setzen muss. Ist erledigt. notify-send mag trotzdem noch nicht und

auf einer Konsole ausgeführt:
# notify-send hallo
(notify-send:27301): GLib-GObject-CRITICAL **: g_object_unref: assertion
`G_IS_OBJECT (object)' failed

# export DISPLAY=:0.0 && notify-send hallo
(notify-send:28170): GLib-GObject-CRITICAL **: g_object_unref: assertion
`G_IS_OBJECT (object)' failed

# export DISPLAY=:0.0 && dbus-launch notify-send hallo
No protocol specified

Dann hab ich rausgefunden, dass man die DBUS-Sitzung dem Aufruf als
Umgebungsvariable mitteilen muss und hab folgendes probiert:

#!/bin/sh
export DISPLAY=:0.0
for f in `find /proc -maxdepth 2 -name environ`
do
grep -z DBUS_SESSION_BUS_ADDRESS $f 2>/dev/null
echo
done|sort -u|sed -e 's/DBUS_SESSION_BUS_ADDRESS=//' -e '/^$/d'|while \
read i
do
export DBUS_SESSION_BUS_ADDRESS="$i"
su jakob -c "dbus-launch notify-send -t 0 hallo $i"
done

Ich habe fvwm als Windowmanager und daher kein gnome-panel, wo ich die
DBUS_SESSION_BUS_ADDRESS rausfinden kann. Hier werden alls environ-Files
in proc nach der Variable abgesucht und entsprechend bei jedem Durchlauf
gesetzt.
Vom xterm aus als root aufgerufen kommt werden mir meldungen mit den
verschiedenen DBUS_SESSION_BUS_ADRESS notify-Meldungen gezeigt.
Aus einer Konsole kommt
Invalid MIT-MAGIC-COOKIE-1 key

Aber root darf auf meinem Display X-Anwendungen starten. Und es wird
keine einzige Meldung über notify angezeigt.

In den Anleitungen, welche ich bisher gefunden habe, reichte eigentlich
immer die DISPLAY-Variable anzugeben.

Hat jemand eine Idee dazu?

lg jakob

Distribution: Debian squeeze/sid
Linux pluto 2.6.32-5-amd64 #1 SMP Mon Mar 7 21:35:22 UTC 2011 x86_64
GNU/Linux
 

Lesen sie die antworten

#1 Jakobus Schuerz
09/05/2011 - 19:37 | Warnen spam
Am 2011-05-09 12:37, schrieb Jakobus Schuerz:
Hi Leute!

Ich hab grad notify-send für mich entdeckt. :-) Für manche Geschichten
ist das doch recht praktisch. Nur hab ich ein Problem. Ich mache meine
Datensicherung regelmàssig per rsnapshot auf eine externe Platte als
root und per cronjob. Und ich würde gerne den Beginn und das Ende der
Datensicherung per notify-send auf meinem Desktop signalisiert haben.
Das Problem ist, es tut nicht. Rufe ich notify-send von einem Xterm als
root auf, dann bekomme ich die Meldung auch angezeigt. Aus einem cronjob
nicht.


Hat jemand eine Idee dazu?




Hab sie jetzt endlich selber gefunden. Die Lösung für mein backupskript,
welches in cron aufgerufen wird, und rsnapshot ausführt schaut
folgendermassen aus:


/usr/local/bin/mkbackup

#!/bin/bash
[ $DISPLAY ] || export DISPLAY=:0.0
user=jakob
startmessage="Erstellen des Backups um `date +%R` gestartet"
stopmessage="Erstellen des Backups um `date +%R` Uhr beendet"



notifying () {
user=$1; shift
message=$@;
pids=`pgrep -u $user`
for pid in $pids; do
# find DBUS session bus for this session
# DBUS_SESSION_BUS_ADDRESS=`grep -z DBUS_SESSION_BUS_ADDRESS \
grep -z DBUS_SESSION_BUS_ADDRESS \
/proc/$pid/environ | sed -e 's/DBUS_SESSION_BUS_ADDRESS=//'
echo
done|sort -u|while read DBUS_SESSION_BUS_ADDRESS
do # use it
DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS \
su $user -c "notify-send -u critical -t 0 -i
/usr/share/app-install/icons/sbackup-conf.png '`basename $0`' '$message'
2>/dev/null"
done
}

notifying $user $startmessage

case `basename $0` in
mkbackup-hourly)Intervall=${0##*-};;
mkbackup-daily)Intervall=${0##*-};;
mkbackup-weekly)Intervall=${0##*-};;
mkbackup-monthly)Intervall=${0##*-};;
*)echo "Falscher Befehl"; exit 1;;
esac

mountstat=0
stat /tmp/mars-mounted 1>/dev/null 2>&1 && mountstat=1
Ziel="/.backup"
test "$Intervall" || Intervall=$1
test "$Intervall" || exit 1
#mount | grep -q $Ziel || mount $Ziel
mount | grep -q $Ziel || /usr/local/bin/mount-mars
mount | grep -q $Ziel || exit 2
rsnapshot $Intervall && notifying $user $stopmessage
test $mountstat -eq 0 && /usr/local/bin/umount-mars
test $mountstat -eq 1 && /usr/local/bin/update-backuplinks

ich habe dazu in /usr/local/bin 4 symlinks angelegt, die alle auf
mkbackup zeigen
mkbackup-hourly
mkbackup-daily
mkbackup-weekly
mkbackup-monthly

das Skript mount-mars und umount-mars hàngt mir meine externe HD auf
/.backup ein/aus, mountet mit --bind das snapshot-Verzeichnis mit der
Option ro nach /backup und ist damit für alle User lesbar zugànglich, da
/.backup/snapshots die Dateirechte 0700 für root hat.

update-backuplinks erzeugt in $HOME für jeden user ein Verzeichnis
$HOME/backup in das nur die snapshots seines Homeverzeichnisses gelinkt
werden. Die Namen der Links sind für "heute" und "gestern" mit diesen
Namen und der Uhrzeit versehen, für àltere Snapshots steht stattdessen
das Datum.

Ich kann die Skripte gerne noch posten, wenn Interesse dazu besteht.

lg jakob
Distribution: Debian squeeze/sid
Linux pluto 2.6.32-5-amd64 #1 SMP Mon Mar 7 21:35:22 UTC 2011 x86_64
GNU/Linux

Ähnliche fragen