Sonntag, 23. Februar 2014

Desktop-Benachrichtigungen aus Skripten senden

Wenn man sich Skripte für regelmäßige Arbeiten am Rechner erstellt hat, möchte man meist auch gerne eine Benachrichtigung erhalten, ob alles korrekt gelaufen ist.

Ich zum Beispiel verwende das Skript-Toolset "Storebackup" um meine täglichen Backups auszuführen. Das Backup-Skript wird per Cronjob gestartet. Leider ist hier das Problem, dass man gerne einen Status erhalten möchte, ob alles ok ist oder das Backup abgebrochen ist.

Hier kann man die Hilfe von dem Programm "notify-send" in Anspruch nehmen. Erst baut man sich seine Nachricht in der Console zusammen und freut sich über die nette Nachricht im Benachrichtigungsfenster auf dem Deskop. Anschließend wird der Befehl im Skript eingebaut, was aber zu einer Überraschung führt.
In der Console funktioniert doch alles super, aber warum erhalte ich nichts, wenn es per Cron ausgeführt wird. Mit ein bisschen Suchmaschinen-Voodoo findet man dann eine Ursache.
Hier liegt mal wieder ein Problem mit den Environment Variablen vor. Ich bin mit untiefen des Programms nicht vertraut, aber es benötigt den Session-Key (DBUS_SESSION_BUS_ADDRESS) der Desktop-Umgebung.

Das Skript sucht sich die Prozess-ID (pid) der Gnome oder KDE Session und liest dann die entsprechenden Environment Variablen aus dem Proc-Filesystem aus.

Für die komfortable Nutzung verwende ich folgende Bash-Funktion

Funktion:
function do_notification
{
    for pid in $(pgrep gnome-session) $(pgrep kdeinit4); do
        unset COOKIE
        COOKIE="$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$pid/environ|cut -d= -f2-)"
        GNUSER="$(ps --no-heading -o uname $pid)"

DBUS_SESSION_BUS_ADDRESS="$COOKIE" /usr/bin/notify-send -u $1 "$NOTIFICATIONHEADER" "$2"
    done

    unset COOKIE
}

Ausruf:
1) do_notification normal "storeBackup >>Home<< successfully"
2) do_notification critical "storeBackup >>Home<< failed"

Ich hoffe, dass es dem einen oder anderen hilft, seine Skripte zu verbessern und mehr Komfort zu erhalten.