Wie rufe ich Zenity aus dem Cron-Skript auf?

8

Beispielskript error.sh:

#! /bin/bash

zenity --error --text='Something very bad has happened!'  

Mein incron-config:

~/Documents IN_MOVED_TO ~/scripts/error.sh

Wenn ich error.shin der Terminal-GUI ausgeführt werde, wird ein Dialogfeld angezeigt, das jedoch nicht im obigen Incron-Szenario angezeigt wird.

Wie kann ich Zenity dazu bringen, diesen Dialog zu öffnen, wenn ich eine Datei in den Ordner "Dokumente" verschiebe?

Zetah
quelle

Antworten:

19

Antwort hier gefunden . Hinzufügen zu ~/.bashrc:

xhost local:$USER > /dev/null

und dann benutze Zenity in einem Skript, das von Cron wie folgt hervorgerufen wird:

zenity --error --text='Something very bad has happened!' --display=:0.0

Hinzufügen --display=:0.0ist wichtig

Zetah
quelle
--display =: 0.0 war wichtig. Aber jetzt habe ich das gleiche Problem für den Service. Es zeigt nichts, wenn ich Skript als Dienst setze!
Dr. Jacky
4

Um einen GUI-Befehl auf cron auszuführen, müssen Sie cron mitteilen, welche Anzeige das Programm verwenden soll. Dafür verwenden Sie: export DISPLAY =: 0

Bearbeiten Sie für eine Zenity-Benachrichtigung alle 30 Minuten crontab -eeinen Job wie folgt und legen Sie ihn fest:

*/30 *  * * *  export DISPLAY=:0 && /somedirectory/your_zenity_script.sh

Detaillierte Anleitung: Link

Damodaranudas
quelle
2

Es gibt eine andere mögliche Lösung, wenn Sie möchten, dass es unabhängig vom Benutzernamen funktioniert, indem Sie den aktiven Benutzer der X-Anzeige mithilfe von ConsoleKit (dem Befehl ck-list-sessions) suchen . Angenommen, das folgende Skript wird als Root ausgeführt, zeigt es dem aktuellen aktiven Benutzer auf Ihrem Computer eine Zenity-Nachricht an:

#!/bin/bash
ACTIVE=$(ck-list-sessions | awk -F' = ' '
    function f(){if(A=="TRUE"){P=U"\t"D;gsub("'"'"'","",P);print P}}
    $1=="\tunix-user"{U=$2} 
    $1=="\tx11-display"{D=$2} 
    $1=="\tactive"{A=$2} 
    END{f()} /^[^\t]/{f()}
')
USERID=${ACTIVE%    *} # tab
USERNAME=$(getent passwd $USERID|cut -f1 -d':')
DISPLAY=${ACTIVE#*  } # tab

DISPLAY="$DISPLAY" su $USERNAME -c "zenity --error --text='Something very bad has happened!'"

Das kleine awk-Skript dient nur zum Parsen von ck-list-Sitzungen und zum Ausgeben des Benutzernamens und der Anzeige des aktiven Benutzers (möglicherweise muss auch eine lokale Verbindung vorhanden sein, wenn Sie ssh-X-Benutzer ausschließen möchten, wenn Sie möchten).

(Ich verwende dies in einem Sicherungsskript , das beim Anschließen eines USB-Laufwerks ausgeführt wird.)

Unhammer
quelle