Ich habe ein Skript erstellt, das mich benachrichtigen soll, wenn ich ein neues Kapitel über Manga lese. Ich habe dazu den Befehl notify-send verwendet. Das Programm funktioniert, wenn ich versuche, es im Terminal auszuführen. Die Benachrichtigung wird angezeigt. Wenn ich dies jedoch in meine Crontab legte, wird die Benachrichtigung nicht angezeigt. Ich bin mir ziemlich sicher, dass das Programm ausgeführt wird, seit ich eine Datei für mich erstellt habe. Die Datei wurde erstellt, aber die Benachrichtigung wurde nicht angezeigt.
Hier ist mein Drehbuch
#!/bin/bash
#One Piece Manga reminder
#I created a file named .newop that contains the latest chapter.
let new=$(cat ~/.newop)
wget --read-timeout=30 -t20 -O .opreminder.txt http://www.mangareader.net/103/one-piece.html
if (( $(cat .opreminder.txt | grep "One Piece $new" | wc -l) >=1 ))
then
(( new+=1 ))
echo $new
echo $new > ~/.newop
notify-send "A new chapter of One Piece was released."
else
notify-send "No new chapter for One Piece."
notify-send "The latest chapter is still $new."
fi
exit
Und hier ist, was ich in meinem crontab schrieb
0,15,30,45 12-23 * * 3 /home/jchester/bin/opreminder.sh
cron
notify-send
user158335
quelle
quelle
export DISPLAY=:0
.16.04
dieser hat für mich*/1 * * * * eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gnome-session)/environ)";/usr/bin/notify-send -i appointment -c "im" "Keep Working"
Antworten:
Befehle müssen auf ihre Position verweisen. So
notify-send
muss es sein/usr/bin/notify-send
Alle Befehle müssen ihren vollständigen Pfad haben.
Verwenden Sie den
whereis notify-send
Befehl, um zu sehen, wo Ihre Befehle "leben"quelle
notify-send
ist dasPATH
gerade für einen Cronjob. Siehe meine Antwort unten.Am 13.04 sieht es anscheinend anders aus, zumindest in Gnome Shell.
Zunächst wird Folgendes
env
gedruckt, wennzzyxy
der Cron-Job des Benutzers (nicht des Roots) ausgeführt wird:Um
notify-send
an die Arbeit zu kommen, scheint es notwendig zu sein, dieDBUS_SESSION_BUS_ADDRESS
Umgebungsvariable gemäß DahitiFs Kommentar auf ubuntuforums.org zu setzen. Stellen Sie einfach Folgendes vor Ihre eigentliche Stellenbeschreibung:Es scheint nicht notwendig zu sein, einzustellen
DISPLAY
.quelle
gnome-session
zuxfce4-session
.gnome-session
und benutztegnome-shell
stattdessen (sei vorsichtig, es gibt auch eine,gnome-shell-calendar-server
damitpgrep
2 Pids bekommen). Ich brauchte auch,DISPLAY=:0
weil ich 2 Bildschirme verwende und es nicht definiert wurde. Vielen Dank!openbox
fürgnome-session
.Der Befehl
notify-send
zeigt die Meldung nicht auf Ihrem Bildschirm an, wenn er von cron gestartet wird. Fügen Sie einfach die Zielanzeige oben in Ihr Skript ein, zum Beispiel:quelle
gdk_mir_display_open Failed to connect to Mir: Failed to connect to server socket: No such file or directory Option parsing failed: Cannot open display:
echo $DISPLAY
in einem Terminal, um sicherzustellen, dass Ihr Display wirklich ist:0
(normalerweise, aber nicht immer).Zumindest für Ubuntu 14.04 ist die obige Antwort von klrmr die richtige Antwort. Es scheint nicht erforderlich zu sein, DISPLAY einzustellen oder vollständige Pfade für das Senden von Benachrichtigungen oder andere normalerweise in $ PATH enthaltene Elemente anzugeben.
Unten ist ein Cron-Skript, mit dem ich eine virtuelle Maschine herunterfahre, wenn der Akkustand eines Laptops zu niedrig wird. Die Zeileneinstellung DBUS_SESSION_BUS_ADDRESS in der obigen Antwort von klrmr ist die Änderung, durch die die Warnungen schließlich korrekt funktionieren.
quelle
In meinem Fall mit Ubuntu 16.04 war ein expliziter Pfad erforderlich. Ich löse das Problem, indem ich ihn hinzufüge
in den ersten zeilen der crontab, vor anruf benachrichtigen-senden.
quelle
Der erste Schuldige ist Ihre crontab-Datei. Sie müssen auch den Benutzernamen angeben, mit dem das Skript ausgeführt werden soll. Behalten Sie es besser als root bei
und dann sollten Sie den Benutzernamen des GUI-Benutzers innerhalb des Skripts verwenden und ihn voranstellen, um mit "sudo oder su" zu benachrichtigen und zu senden, damit der Befehl als Benutzer ausgeführt wird, dem die GUI gehört
Beispiel:
oder
Wo
gnome_user_name
ist der Benutzername des Benutzers, der die GUI-Sitzung gestartet hat? Sie haben sich angemeldet. Wenn Sie eine dynamische Auswahl treffen möchten, können Sie ihn von abrufenBeispiel:
oder
quelle
oniltonmaciel
aber$GNOME_USER
onilton+
Die Art und Weise, wie die Binärdatei die dbus-Adresse abruft, scheint sich in letzter Zeit geändert zu haben. Unter Ubuntu 15.04 (Vivid Vervet) mit "notify-send 0.7.6" werden die folgenden zwei Variablen benötigt:
Die Anweisung von 'krlmlr' wird als gut bewertet und legt die richtige Adresse fest, der Dialog wird jedoch nicht von einem Cron-Job angezeigt.
quelle
Wenn Ihr Skript in crontab als root ausgeführt wird, funktionieren die obigen Antworten wahrscheinlich nicht. Probieren Sie diese Funktion aus, die für mich in 16.04 gut funktioniert:
(Quelle: https://unix.stackexchange.com/a/344377/7286 )
quelle
Verlassen Sie sich besser auf den
dbus-session
Prozess, er sollte auf allen Systemen ausgeführt werden, auf denen erDBUS_SESSION_BUS_ADDRESS
vorhanden ist.Erstellen Sie ein Skript:
Mach es ausführbar:
Füge es zu crontab hinzu:
quelle
Es hat ewig gedauert, bis die Arbeit an Ubuntu 15.10 abgeschlossen war. Es musste eine Quelle hinzugefügt werden, um die normalen Umgebungsvariablen des Benutzers zu erhalten. Meine Anzeige war: 1 aus irgendeinem Grund auch. Verwenden der ersten Ergebnis-PID der Gnome-Sitzung für die Suche nach DBUS_SESSION_BUS_ADDRESS.
quelle
Ich habe das gerade mit dem Zimt-Desktop unter Ubuntu 15.10 unter Verwendung des folgenden Rezepts funktioniert:
Der Trick bestand darin, zu erkennen, dass "Zimtsitzung" zu lang ist, um von pgrep gefunden zu werden:
Ich musste auch \ grep verwenden, da mein grep mit Alias versehen ist
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
Problem durch Aufruf
python3
von crontab mitUTF-8
Gebietsschema.TL; DR: Präfixaufruf in crontab mit Gebietsschema wie in:
Siehe auch click und python3 :
quelle
Für alle crontab-Skripte, die libnotify verwenden, verwende ich Folgendes:
Es funktioniert auch, wenn ich cron im root-Modus verwende.
quelle
Sie benötigen lediglich den X_user und die X_userid. Ersetzen Sie beide im Befehlsbalg.
Lösung mit systemd
/etc/systemd/system/opreminder.service #Service-Datei
/etc/systemd/system/opreminder.timer #timer Datei
/home/jchester/bin/opreminder.sh #Das Skript
Es ist nicht erforderlich, sudo -u zu verwenden, wenn die Servicedatei bereits für den vorgesehenen Benutzer festgelegt wurde
Quelle: https://wiki.archlinux.org/index.php/Desktop_notifications#Usage_in_programming
quelle