Ich benutze Arch Linux mit KDE / Awesome WM. Ich versuche mit
notify-send
zu arbeiten cron
.
Ich habe versucht, DISPLAY
/ XAUTHORITY
Variablen zu setzen und notify-send
mit "sudo -u" zu laufen , alles ohne Ergebnis.
Ich kann notify-send interaktiv von der Sitzung aus aufrufen und Benachrichtigungen erhalten.
FWIW, der Cron-Job läuft einwandfrei, was ich überprüft habe, indem ich Sachen in eine temporäre Datei zurückgesendet habe. Es ist nur das "Benachrichtigen-Senden", das nicht funktioniert.
Code:
[matrix@morpheus ~]$ crontab -l
* * * * * /home/matrix/scripts/notify.sh
[matrix@morpheus ~]$ cat /home/matrix/scripts/notify.sh
#!/bin/bash
export DISPLAY=127.0.0.1:0.0
export XAUTHORITY=/home/matrix/.Xauthority
echo "testing cron" >/tmp/crontest
sudo -u matrix /usr/bin/notify-send "hello"
echo "now tested notify-send" >>/tmp/crontest
[matrix@morpheus ~]$ cat /tmp/crontest
testing cron
now tested notify-send
[matrix@morpheus ~]$
Wie Sie sehen, hat das Echo vor und nach dem Benachrichtigungsversand funktioniert.
Auch ich habe Einstellung versuchtDISPLAY=:0.0
UPDATE: Ich habe ein bisschen mehr gesucht und festgestellt, dass DBUS_SESSION_BUS_ADDRESS gesetzt werden muss. Und nachdem ich dies mit dem Wert, den ich in meiner interaktiven Sitzung erhalten hatte, fest codiert hatte, tauchte jede Minute die winzige kleine "Hallo" -Meldung auf dem Bildschirm auf!
Aber der Haken ist, dass diese Variable für diesen Beitrag nicht permanent ist, also werde ich versuchen, die dort vorgeschlagene Named-Pipe-Lösung zu verwenden.
[matrix@morpheus ~]$ cat scripts/notify.sh
#!/bin/bash
export DISPLAY=127.0.0.1:0.0
export XAUTHORITY=/home/matrix/.Xauthority
export DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-BouFPQKgqg,guid=64b483d7678f2196e780849752e67d3c
echo "testing cron" >/tmp/crontest
/usr/bin/notify-send "hello"
echo "now tested notify-send" >>/tmp/crontest
Da cron
das Senden von Benachrichtigungen anscheinend nicht unterstützt wird (zumindest nicht direkt), gibt es ein anderes Benachrichtigungssystem, das cron
benutzerfreundlicher ist, als ich es kann?
&>>/tmp/crontest
der Benachrichtigungssendezeile ein hinzu und prüfen Sie, obnotify-send
Fehlermeldungen angezeigt werden.Antworten:
Sie müssen die
DBUS_SESSION_BUS_ADDRESS
Variable einstellen . Standardmäßig hat cron keinen Zugriff auf die Variable. Um dies zu beheben, platzieren Sie das folgende Skript irgendwo und rufen Sie es auf, wenn sich der Benutzer anmeldet, zum Beispiel mit awesome und derrun_once
im Wiki erwähnten Funktion. Jede Methode ist geeignet, da es nicht schadet, wenn die Funktion häufiger als erforderlich aufgerufen wird.Dadurch wird eine Datei erstellt, die die erforderliche Dbus-Umgebungsvariable enthält. Dann importieren Sie in dem von cron aufgerufenen Skript die Variable, indem Sie das Skript aufrufen:
Hier ist eine Antwort, die denselben Mechanismus verwendet.
quelle
Sie müssen die Variablen in der Crontab selbst einstellen:
Nicht
sudo
nötig, zumindest nicht auf meinem System.quelle
Der sicherste Weg, um auf X-Sitzungen bezogene Umgebungsvariablen abzurufen, besteht darin, sie aus der Umgebung eines Prozesses des an X angemeldeten Benutzers abzurufen. Es scheint ein Problem für mich zu sein (unter Debian):
Dies sendet eine Nachricht an den ersten X-Benutzer, den es findet, obwohl Sie eine Schleife hinzufügen können, um sie an alle Benutzer zu senden.
Aktualisieren
Es scheint, dass Aktualisierungen des utmp-Formats dazu führen
who
, dass eine Anzeige anstelle eines tty in der zweiten Spalte gedruckt wird. Das macht die Sache tatsächlich einfacher, zuvor wurde nur die Anzeige im Kommentar am Ende gedruckt, und ich entschied, dass dies nicht sicher war, um die ursprüngliche Antwort zu erhalten. Wenn dies der Fall ist, versuchen Sie Folgendes:quelle
who_line
Befehl keine tty enthält . Die Ausgabe sieht aus wieme :0 2015-09-23 10:40 ? 17234
.Dieser Einzeiler arbeitete für mich in Manjaro mit Cronie:
Ohne die sehr hässliche DBUS_blah_blah geht es gar nicht. Ich fand auch
journalctl -xb -u cronie
hilfreich. Ich bin noch nicht mit Cronie vertraut, habe aber meine "crontab" as erstellt/etc/cron.d/mycronjobs
und bin mir nicht sicher, ob dieser Dateiname erforderlich ist oder ob er nur alles im Verzeichnis cron.d liest.Ich habe die Lösung hier gefunden: https://wiki.archlinux.org/index.php/Desktop_notifications
quelle
Ich benutze i3 unter Ubuntu 18.04. Mein Weg, dies zu lösen, ist:
* * * * * XDG_RUNTIME_DIR=/run/user/$(id -u) notify-send Hey "this is dog!"
quelle
Dies reicht aus, um das Senden von Benachrichtigungen in einem Cronjob auf Ubuntu Trusty für mich zu erledigen:
Es exportiert einfach das
DISPLAY
für den Benutzer, unter dem der Cronjob ausgeführt wird. Es funktioniert bei mir ohne EinstellungXAUTHORITY
oderDBUS_SESSION_BUS_ADDRESS
.quelle
Für diejenigen unter Linux, die sich mit der Installation von Python-Paketen wohl fühlen, habe ich gerade ein Benachrichtigungs-Send-Headless- Programm veröffentlicht, das für mich gut funktioniert. Es sucht
/proc
nach den erforderlichen Benutzernamen- und Umgebungsvariablen und wird dannnotify-send
mit diesen Variablen ausgeführt (wird verwendetsudo
, um bei Bedarf zum erforderlichen Benutzer zu wechseln).quelle
Sie können auch ein Skript erstellen:
Dann starte es mit
sudo
. Da jedochcrontab -e
alle Befehle mit dem Benutzer ausgeführt werden, der sie erstellt hat, sollte beim Aufrufen ohne Folgendes ausreichensudo
:Zumindest für mich. Es scheint alles von der Umgebungskonfiguration abhängig zu sein.
quelle
Ich benutze dieses Skript in Cron, um MPD zu posten, das jetzt stündlich auf Twitter abgespielt wird
ähnliches Skript mit notify-send
Möglicherweise treten Probleme auf, da KDE seinen eigenen notify-deamon IIRC verwendet.
quelle
Für was es wert ist ....
Ich musste auf Debian Jessie ALLE der folgenden Befehle verwenden, um dies zum Laufen zu bringen ...
Das Weglassen eines dieser Punkte führte dazu, dass es nicht mehr funktionierte.
quelle
*-0
in Ihremsession-bus
Verzeichnis keine Datei mit einem wörtlichen Namen vorhanden ist . Das hättest du wohl gemeintsource "$HOME"/.dbus/session-bus/*-0
.Sudo benutzen:
Tipp:
Mit diesem Befehl können wir den aktuellen x-Benutzer ermitteln
Und dazu...
Gut zu wissen :
Cron, das unter root ausgeführt wird, hat keinen Zugriff auf x, daher werden nicht alle GUI-Befehle angezeigt. Eine einfache Lösung besteht darin, root für den aktuellen x-Benutzer mit diesem Befehl zu einem autorisierten x-Benutzer hinzuzufügen
aus der x User Shell
oder
quelle
Hier ist ein weniger komplexes Skript als das, was Graeme bereitgestellt hat. Sein Drehbuch hat bei mir nicht funktioniert,
$who_line
war immer leer. Mein Skript verschwendet nicht so viel Zeit damit, einen Prozess zu finden. Stattdessen wird einfach alles versucht und der zuletzt gefundene nützliche Wert ausgewählt. Ich verwende xubuntu 14.04 und habe einige lxc-Container, die diese Art von Skripten wahrscheinlich verwirren.quelle
DBUS_SESSION_BUS_ADDRESS
. Ich kann es aus meinen Muscheln beziehen, aber nicht aus dem Xorg-Prozess.