Wie kann ich eine Benachrichtigung auslösen, wenn ein Job / Prozess endet?


86

Der Ort, an dem ich arbeite, verfügt über Befehle, deren Ausführung viel Zeit in Anspruch nimmt.

Gibt es einen Befehl / ein Dienstprogramm, mit dem ich benachrichtigt werden kann, wenn die Befehlsausführung beendet ist? Es könnte sich um ein Popup-Fenster oder ein kleines Geräusch handeln.


1
@ slhcks akzeptierte Antwort ist cool - ich hätte erkennen sollen, dass fg;say "Job finished"das funktionieren würde. Aber ... gibt es eine Möglichkeit, wie es weiter automatisiert werden kann - z. B. das Klingeln oder das Benachrichtigen nach Abschluss eines Auftrags, der mehr als eine Minute dauert? Gibt es eine Shell-Variable, z. B. in Bash, die die verstrichene Zeit des letzten Befehls angibt?
Krazy Glew

... 2 Stunden später in timer_stop stackoverflow.com/questions/1862510/… ... put '(($ timer_show> $ {LONG_RUNTIME: -300})) && say "Langzeitjob abgeschlossen"' gefunden ... Als nächstes fügen Sie zu den Kompilierungsbefehlen von Emacs hinzu ... und benachrichtigen meine Pebble-Uhr (ich hasse Telefonbenachrichtigungen)
Krazy Glew

Antworten:


119

Wenn Sie dies wissen, bevor Sie den Befehl ausführen, können Sie ihn im Allgemeinen mit folgendem Befehl starten:

command; command-after &

Dies wird ausgeführt, command-after nachdem der vorherige Befehl beendet wurde (unabhängig von seinem Beendigungscode). Das &wird es im Hintergrund starten.

Wenn Sie sich für einen erfolgreichen oder fehlgeschlagenen Exit interessieren, verwenden Sie:

command && command-after-only-if-success &
command || command-after-only-if-fail &

Wenn der Befehl bereits gestartet wurde, können Sie ihn mit der Jobsteuerung fganhalten und mit Ihrer Benachrichtigung in den Vordergrund zurückkehren :

command
# enter Ctrl-z
fg ; command-after

Nun… was Sie danach tun möchten, hängt von Ihrer Umgebung ab.

  • Auf jedem System können Sie die Terminalklingel "läuten" . Hängt von Ihrem genauen System ab, was wirklich funktioniert (BSD vs. GNU Linux usw.), tput belsollte aber reichen. Ich konnte es momentan jedoch nicht zuverlässig testen. Suche nach "Klingel", um mehr zu erfahren.

  • Unter Mac OS X können Sie mit AppleScript ein Finder-Dialogfeld öffnen:

    osascript -e 'tell Application "Finder" to display dialog "Job finished" '
    

    Du könntest es dir etwas sagen lassen:

    say "Job finished"
    

    Oder Sie können das Benachrichtigungssystem von Mountain Lion verwenden:

    sudo gem install terminal-notifier # <= only need to do this once
    terminal-notifier -message "Job finished!" -title "Info"
    
  • In GNOME , zenitykann ein GTK - Dialogfeld zeigt, von der Kommandozeile aufgerufen. Siehe auch diese Frage zum Stapelüberlauf: Anzeigen eines Meldungsfelds aus einem Bash-Skript unter Linux . Es kann über Ihren bevorzugten Paketmanager installiert werden.

    zenity --info --text="Job finished"
    
  • Einige Distributionen haben möglicherweise xmessage. Speziell für GTK-Umgebungen gibt es gxmessage.

  • In Desktop-Umgebungen wie Ubuntu und GNOME , in denen die Desktop-Benachrichtigungsspezifikation implementiert ist , gibt es ein Benachrichtigungssystem, mit dem Sie (einen Teil von ) auslösen können .notify-sendlibnotify

    notify-send "Job finished!"
    
  • KDE verwendet kdialogzum Beispiel:

    kdialog --passivepopup 'Job finished'
    

Lassen Sie mich wissen, welchen Befehl Sie verwendet haben! Ich habe auch einige andere Optionen hinzugefügt.
Slhck

Ich fummele an Benachrichtigungssendungen und xmessage herum. Beide scheinen interessant zu sein! Hier ist das nächste, wonach ich suche - superuser.com/questions/345463/…
Utkarsh Sinha

2
Unter Mac OS X können Sie auch das Befehlszeilenprogramm "say" verwenden. es sind auch viele stimmen verfügbar, überprüfen sie "say -h";)
trinth

1
Warum schlagen Sie vor, "command-after" asynchron auszuführen? Meinten Sie sagen (command; command-after) &?
G-Man,

Diese Lösung ist für Konsolenbenutzer gedacht und keine perfekte Lösung, da Ihr Befehl entweder so lange ausführlich ist, bis er vollständig ausgeführt wurde, oder bis die Eingabeaufforderung wieder angezeigt wird (keine Ausgabe). Dies ist jedoch genau das, was ich brauchte, als ich nach Hilfe suchte. Sie können Konsole so konfigurieren, dass eine Benachrichtigung angezeigt, ein Sound abgespielt usw. wird. Anschließend müssen Sie die Shell-Überwachung aktivieren. Achten Sie auf Stille, wenn Ihr Befehl eine Reihe von Informationen ausgibt, bis er abgeschlossen ist, oder auf Stille, wenn nichts gedruckt wird und die Shell dann zurückkehrt.
MrMas

20

Auf Unix-ähnlichen Systemen können Sie die akustische Glocke läuten:

echo -e "\a"

Dies ist wirklich nützlich, zusätzlich zu einer Benachrichtigung auf dem Mac
Sirenen

2
wietput bel
Dwight Spencer


5

Um eine akustische Benachrichtigung zu erhalten, können Sie verwenden spd-say "Some text". Beispiel:

some-command; spd-say "Yo"

Welches Betriebssystem? Ich sehe es nicht auf Mac oder Ubuntu
Edward Falk

@EdwardFalk Ich benutze Ubuntu
milkovsky

OK, ich verwende eine ziemlich alte Version, also ist es vielleicht in neueren Versionen.
Edward Falk

1
Es ist nur eine Text-to-Speech-Anwendung. Sie können es über installieren sudo apt-get install speech-dispatcher. Oder verwenden Sie Alternativen askubuntu.com/questions/501910/…
milkovsky

Ahh, nicht standardmäßig installiert? Ich hätte darüber nachdenken sollen. Danke für den Link.
Edward Falk

4

Ich habe gerade damit begonnen, notifu für Desktop-Benachrichtigungen von Cygwin zu verwenden. Es ist eine Befehlszeilen-Benachrichtigungs-App für Windows.

Beispiel:

ls -l && /c/notifu-1.6/notifu64 /m "This is a simple Notifu message."

4

Ich habe ntfygenau zu diesem Zweck geschrieben. Es ist plattformübergreifend und kann automatisch Benachrichtigungen senden, wenn lange laufende Befehle beendet sind.

Wenn Sie Pythons haben pip(die meisten Linux-Distributionen und MacOS haben es), installieren Sie es wie folgt und aktivieren Sie automatische Benachrichtigungen:

$ sudo pip install ntfy
$ echo 'eval "$(ntfy shell-integration)"' >> ~/.bashrc
$ # restart your shell

Überprüfen Sie es auf http://ntfy.rtfd.io

Darüber hinaus kann es auch:

  • Automatische Benachrichtigungen unterdrücken, wenn sich das Terminal im Vordergrund befindet (X11, iTerm2 und Terminal.app werden standardmäßig unterstützt und aktiviert)
  • Cloud-basierte Benachrichtigungen senden (Pushover, Pushbullet und XMPP)
  • Wird verwendet, um Benachrichtigungen zu senden, wenn ein Prozess endet (nicht die oben genannte automatische Unterstützung).
  • Benachrichtigungen manuell senden (gut für die Verwendung in Skripten!)

Gut auf dich Dies ist wirklich die brauchbarste Antwort.
Adam Bittlingmayer

Genau. Ich verwende es, um eine Benachrichtigung auf meinem Desktop anzuzeigen und gleichzeitig die Benachrichtigung auf mein Telefon zu übertragen.
Michael

3

Für Linux gibt es einen raffinierten Trick, um dies automatisch zu tun, ohne jedes Mal einen Befehl zur Benachrichtigung eingeben zu müssen.

Installieren Sie zuerst autokey. Auf diese Weise können Sie Aktionen für verschiedene Tastenanschläge definieren.

sudo apt-get install autokey-gtk

Definieren Sie nun eine neue Phrase in Autokey und weisen Sie den Hotkey als Alt + Enter zu. Diesen Satz hinzufügen:

; notify-send "Job finished!" &
  #

Beachten Sie, dass eine neue Zeile nach der ersten Zeile wichtig ist.

Fügen Sie außerdem einen Fensterfilter hinzu. Ich benutze Guake und Terminal. Schließen Sie jedes andere Terminal ein, das Sie verwenden.

.*(guake)|(Terminal).*

Sie sind fertig!!

Führen Sie jetzt jedes Mal, wenn Sie Benachrichtigungen für einen Befehl benötigen, die Tastenkombination Alt + Enter anstelle von Enter / Return aus.

Quelle: http://dotpad.blogspot.in/2014/12/notification-when-command-finished.html


3

Obwohl andere Antworten bereits die meisten Möglichkeiten erörterten, Benachrichtigungen über einen abgeschlossenen Auftrag zu erhalten, möchte ich meine zwei Cent angeben, da Sie Ihre Frage in folgendem Format gestellt haben:

Der Ort, an dem ich arbeite, verfügt über Befehle, deren Ausführung viel Zeit in Anspruch nimmt.

Ich habe das gleiche Problem. Manchmal kann etwas 15 Minuten lang laufen.

Ich habe folgende Funktion in meiner .bashrc:

# push a notification to your phone. can be handy if you're running a
# build and you want to be notified when it's finished.
push() {
    curl -s -F "token=PUSHOVER_TOKEN" \
    -F "user=PUSHOVER_USER" \
    -F "title=terminal" \
    -F "message=$1" https://api.pushover.net/1/messages.json > /dev/null 2>&1
}

Hierbei wird die Pushover-App verwendet, um eine Benachrichtigung an mein Telefon zu senden. Auf diese Weise kann ich zum Mittagessen gehen oder an einer Besprechung teilnehmen und trotzdem über Jobs informiert werden, die ich auf meinem Computer gestartet habe, bevor ich abgereist bin.

Ich benutze es auf folgende Weise:

command_to_run && push "yes! command finished successfully!" || push "awww man! something failed :-("

Wenn der Befehl einen korrekten Beendigungscode zurückgibt, wird der erste Push ausgeführt. Bei einem Fehler wird der zweite ausgeführt.

Ofc müssen Sie einen Benutzer bei Pushover erstellen und eine App registrieren, um Benachrichtigungen von https://pushover.net/ senden zu können.

hoffe das hat geholfen!


OK, also "Pushover" ist ein Webdienst, der Benachrichtigungen an Telefone sendet, auf denen die "Pushover" -App installiert ist?
Edward Falk

1
Es ist ein Webdienst, der Benachrichtigungen über einen modernen Webbrowser an Telefone, Computer und alles andere sendet . So können Sie Pushover auf Ihrem PC und Telefon öffnen und auf allen Geräten benachrichtigt werden. ordentlich, nicht wahr? :-)
Thatkookooguy

1

Wenn Sie csh oder tcsh als interaktive Shell verwenden, können Sie den folgenden notifyBefehl verwenden:

% long-running-command &
[1] 14431
% notify %1
% 
(later, when the command finishes)
[1]    Done                          long-running-command

Sie können einen ähnlichen Effekt mit set -boder erzielen set -o notify.

Dies entspricht wahrscheinlich nicht Ihren Anforderungen, da nur eine Nachricht gedruckt wird. Ich glaube nicht, dass es konfiguriert werden kann, um ein Fenster zu öffnen oder die Glocke zu läuten.


Ich versuche zu vermeiden, auf die Shell zu schauen, um herauszufinden, ob ein Job beendet ist. Trotzdem danke!
Utkarsh Sinha


1

Wenn Sie verwenden npmdann Knoten-Anmelder bieten eine plattformübergreifende Lösung .

notify -t "Agent Coulson" --icon https://raw.githubusercontent.com/mikaelbr/node-notifier/master/example/coulson.jpg -m "Well, that's new. "

Vorschau

  • Linux KDE

Linux KDE

  • Windows

Windows

  • Mac OS

Mac

  • Knurren

Knurren


1

Ich wünschte, ich hätte diesen Thread vor Jahren bemerkt. Meine Lösung war im Wesentlichen die gleiche wie die von slhck, aber ich habe ein Skript geschrieben. Ich benutze es die ganze Zeit. Hier posten, um es zu teilen.

#!/bin/bash

msg='all done'
quiet=false
if [ "$1" = '-q' ]; then quiet=true; shift; fi
if [ $# -gt 0 ]; then msg="$*"; fi

echo -ne "\x1b]0;$msg\a"
if [ -x /usr/bin/zenity ]; then
  unset WINDOWID
  exec zenity --info --text="$msg"
elif [ -x /usr/bin/xmessage ]; then
  exec xmessage -nearmouse "$msg"
elif [ -x /usr/bin/osascript ]; then
  if ! $quiet; then say "done" &; fi
  osascript -e "tell application \"System Events\" to display dialog \"$msg\""
else
  echo $msg
fi

Eine kleine Erklärung: Der String "\x1b]0;$msg\a"ist die ANSI-Escape-Sequenz, mit der die Nachricht in die Titelleiste des Fensters eingefügt wird, in dem sie ausgeführt wurde. Ich finde es manchmal ganz praktisch, zu sehen, aus welchem ​​Fenster die Nachricht kam.




0

Ich habe eine App erstellt, die eine Benachrichtigung an Ihr Android-Telefon sendet, wenn ein Vorgang endet, sodass Sie nicht an Ihren Computer gebunden sein müssen.

Installieren Sie und fügen Sie dann ;notifier.sham Ende Ihres Befehls hinzu.

Wenn Ihr Befehl beispielsweise war make install, würden Sie Ihren Befehl ausführen:

make install; notifier.sh

https://notifier.sh

https://play.google.com/store/apps/details?id=sh.notifier

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.