Wie kann ich cron verwenden, um Nachrichten per Benachrichtigung und Senden auf dem Bildschirm anzuzeigen?

7

Ich spiele mit notify-sendund cron(auf einer Arch-Maschine) herum und kann keinen Weg finden, sie zu kombinieren:

Ich habe die hier und hier gegebene Lösung ausprobiert , aber keine hat funktioniert. Wie kann ich sie verwenden?

EDIT: Ich habe das DISPLAY in der Crontab eingestellt und es hat immer noch nicht funktioniert. Ich habe das gleiche in Ubuntu versucht und dort funktionieren die Dinge gut. Hier ist meine Cron-Linie:

*/1 * * * * DISPLAY=:0.0 /usr/bin/notify-send "hellp" || echo "er" > .er
Yotam
quelle
1
Auf welche Weise haben sie nicht funktioniert? Hast du daran gedacht zu setzen DISPLAY?
Michael Mrozek
Was sind die Fehlermeldungen (sie werden Ihnen per lokaler E-Mail gesendet, stellen Sie sicher, dass Sie einen MTA installiert haben, und überprüfen Sie /var/mail/yotamoder /var/spool/mail/yotam)? Möglicherweise müssen Sie XAUTHORITYzusätzlich einstellen DISPLAY, um diese Antwort zu sehen .
Gilles 'SO - hör auf böse zu sein'
Wird die Meldung "Authentifizierungsfehler" angezeigt /var/log/cron? Wenn es angezeigt wird, prüfen Sie, ob Sie eine /etc/pam.d/crondDatei unter Ubuntu haben. Wenn ja, stehlen Sie es, sonst sehen Sie, dass der Cron-Job wegen Pam nicht ausgeführt wird? Thread im openSUSE-Forum.
Manatwork

Antworten:

3

Das einzige, was ich vorschlagen kann, ist, eine Named Pipe zu erstellen und Cron in die Pipe schreiben zu lassen und ein kleines Skript vom Sitzungsmanager starten zu lassen, das aus der Pipe liest und notify-send aufruft:

while read line < /tmp/.cron2notify.s  # pipe name in /tmp
do notify-send "Cron message" "$line"
done

Lassen Sie dann in der Crontab das Programm schreiben /tmp/.cron2notify.s.

Ich habe dies noch nicht getestet, sollte Ihnen aber einen Ausgangspunkt geben, von dem aus Sie arbeiten können.

Arcege
quelle
1

Ich denke, notify-senddas D-Bushängt von den meisten Systemen ab, und die häufigste Methode zur Kontaktaufnahme mit dbus ist die $DBUS_SESSION_BUS_ADDRESSVariable. Eine harte Codierung crontabist jedoch wahrscheinlich nicht sehr praktikabel, da sich die Busadresse jedes Mal ändert, wenn Sie eine neue Instanz von dbus starten. Dies geschieht normalerweise, wenn Sie sich anmelden oder neu starten. Die Lösung von Arcege klingt nach einer guten Problemumgehung.

jw013
quelle
1

Ich würde wirklich empfehlen, ein Wrapper-Skript zu verwenden. Um den Cron-Aufruf von notify-send zu emulieren, sshed ich mit "ssh localhost" in mein eigenes System. Das Aufrufen von '/ usr / bin / notify-send "foo"' hat nicht funktioniert, und ich hatte kein Glück, als ich DISPLAY =: 0.0 zur Zeile hinzufügte. Folgendes hat funktioniert:

DBUS_SESSION_BUS_ADDRESS="$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/`pgrep -u username cinnamon|head -1`/environ | sed 's/DBUS_SESSION_BUS_ADDRESS=//')" /usr/bin/notify-send "foo"

Das ist sehr chaotisch, um es gelinde auszudrücken. Das ist sauberer.

#! /bin/bash

DBUS=$(pgrep -ou $1 cinnamon)
DBUS="$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$DBUS/environ | sed 's/DBUS_SESSION_BUS_ADDRESS=//')"

DBUS_SESSION_BUS_ADDRESS="$DBUS" /usr/bin/notify-send $2

Und in cron:

*/1 * * * * /path/to/notify.sh user "help"

Bitte beachten Sie, dass das "Zimt" -Bit vorhanden ist, da dies der Fenstermanager ist, den ich verwende. Sie müssen es wahrscheinlich durch Nautilus oder was auch immer Sie als Fenstermanager haben ersetzen. Ich habe auch einen Benutzer als erstes Argument angegeben, da es später modularer wird, wenn Sie möchten, dass dies funktioniert, unabhängig davon, wer angemeldet ist.

Falsche Namen
quelle
Hat einwandfrei funktioniert :) Vielen Dank!
AkiRoss
0

Ich habe versucht, die Antwort von Arcege zu verwenden, konnte sie jedoch nicht zum Laufen bringen: Die while-Schleife wird beendet, nachdem die erste Zeile in die Named Pipe geschrieben wurde. Was für mich funktioniert hat, war ein ähnliches Skript mit einer Endlosschleife, in der ich von cron gesendete Signale abfange und dann notify-send aufrufe. Das folgende ist das Programm "Benachrichtigen-Weiterleiten":

#! /bin/bash
function coffee () {
   notify-send "foo" "bar"
}
function lunch () {
   notify-send "bar" "foo" 
}
while true; do
  sleep 10
  trap coffee SIGUSR1
  trap lunch SIGUSR2
done

und mein crontab sieht aus wie

55 09,13 * * * pkill -USR1 forward-notify
55 11 * * * pkill -USR2 forward-notify
Åsmund Ervik
quelle
0

Alternative: Sie könnten mit all dem ringen, was Sie tun, oder einfach die xmessage-Option verwenden:

    MSSG="/tmp/mssg-file-${RANDOM}" 
    echo -e " MESSAGE \n ==========\n Done with task, YEY. " > ${MSSG}
    xmessage -center -file ${MSSG} -display :0.0 
    [[ -s ${MSSG} ]] && rm -f ${MSSG}
Mike Q.
quelle