Ich möchte eine Desktop-Benachrichtigung erhalten, wenn ein Befehl, der länger als beispielsweise 15 Sekunden ausgeführt wurde, in einer interaktiven Shell ausgeführt wird.
Mit anderen Worten, ich möchte, dass alle Befehle in so etwas eingeschlossen sind
start=$(date +%s);
ORIGINAL_COMMAND;
[ $(($(date +%s) - start)) -le 15 ] || notify-send "Long running command finished"
Was ist der beste Weg, um dies in bash zu erreichen?
bash
notification
aioobe
quelle
quelle
Antworten:
Sie möchten, dass https://launchpad.net/undistract-me (aus den Ubuntu-Archiven installierbar
sudo apt-get install undistract-me
) genau das tut, was Sie sich wünschen , einschließlich der automatischen Arbeit (d. H. Ohne daran zu denken, dass Sie potenziell langwierigen Dateien etwas hinzufügen müssen). laufende Befehle).quelle
sleep 30
, aber ohne Benachrichtigung getestet ..bashrc
:. /usr/share/undistract-me/long-running.bash
notify_when_long_running_commands_finish_install
. Es scheint ein Fehler zu sein: github.com/jml/undistract-me/issues/23Soweit ich verstanden habe, möchten Sie einen Wrapper . Sie möchten einen Befehl verwenden, damit Sie benachrichtigt werden, wenn die Laufzeit Ihres Befehls mehr als 15 Sekunden beträgt. Also hier ist es.
Kopieren Sie diese Funktion in Ihre
~/.bashrc
und Quelle~/.bashrc
als,Verwendung
Wenn es länger als 15 Sekunden dauert, erhalten Sie eine Desktop-Benachrichtigung, die den Befehl und seine Ausführungszeit beschreibt.
Beispiel
quelle
"$@"
nicht$@
. Großer Unterschied.wrapper
vor jedem von mir eingegebenen Befehl zu schreiben .command; alert
ist in der Tat kürzer alswrapper command
:-)notify-send
Zeitlimit für längere Zeit abläuft, geben Sie notify-send ein benutzerdefiniertes Zeitlimit (in Millisekunden). zBnotify-send --expire-time 999999999 ...
In
~/.bashrc
gibt es einen Aliasalert
, der wie folgt definiert ist:Hiermit kann der Abschluss der Befehlsausführung gemeldet werden.
Verwendungszweck:
z.B
Sie können den Alias nach Bedarf und Wunsch anpassen.
quelle
Abgesehen von einem Wrapper wie dem von Souravc vorgeschlagenen gibt es keine wirklich gute Möglichkeit, dies in bash zu tun. Sie können sich mit einer DEBUG-Falle und einem PROMPT_COMMAND zurechtfinden. Ein DEBUG-Trap wird ausgelöst, wenn Sie einen Befehl ausführen, und PROMPT_COMMAND wird unmittelbar vor dem Schreiben der Eingabeaufforderung ausgeführt.
So
~/.bashrc
wird sowas für sowasDies ist ein Hack, also wundern Sie sich nicht, wenn Sie dabei auf merkwürdige Nebenwirkungen stoßen.
quelle
BEARBEITEN
TL; DR : Erstellt eine Verknüpfung zur automatischen Vervollständigung in
.inputrc
und funktioniert in.bashrc
. Führen Sie den Befehl wie gewohnt aus, geben Sie ihn ein, ENTERund drücken Sie stattdessen die von Ihnen angegebene Verknüpfung.inputrc
Die Person, die Kopfgeld auf diese Frage setzte, sagte:
Bei der Suche nach Lösungen für dieses Problem bin ich auf diese Frage von stackexchange gestoßen, die das Binden CtrlJan eine Folge von Befehlen ermöglicht: Ctrla(zum Zeilenanfang gehen), "mesure" -String vor den von Ihnen eingegebenen Befehl setzen, Ctrlm(ausführen)
So erhalten Sie die Funktionalität der automatischen Vervollständigung und einen separaten ENTERBefehl zum Messen der Zeit, während der ursprüngliche Zweck der zweiten Funktion, die ich unten gepostet habe, beibehalten wird.
Ab sofort sind hier die Inhalte meiner
~/.inputrc
Datei:"\C-j": "\C-a measure \C-m"
Und hier sind die Inhalte von
.bashrc
(Anmerkung: Ich habe Bash nicht für immer verwendet - ich verwende MKSH als meine Shell, daher ist das, was Sie im ursprünglichen Beitrag sehen. Die Funktionalität ist immer noch die gleiche).Ursprünglicher Beitrag
Hier ist meine Idee - benutze eine Funktion in
.bashrc
. Grundprinzip - Verwenden Sie/usr/bin/time
diese Option, um die Zeit zu messen, die der Befehl benötigt, und senden Sie eine Benachrichtigung, wenn er länger als 15 Sekunden dauert.Hier leite ich die Ausgabe um,
/dev/null
aber um die Ausgabe anzuzeigen, kann auch die Umleitung in eine Datei erfolgen.Ein viel besserer Ansatz, IMHO, ist es, die Ausgabe der Zeit an eine Datei in Ihrem Home-Ordner zu senden (nur damit Sie Ihr System nicht mit Zeitdateien beschmutzen und immer wissen, wo Sie suchen müssen). Hier ist die zweite Version
Und hier sind die Screenshots der ersten und zweiten Version, in dieser Reihenfolge
Erste Version, keine Ausgabe
Zweite Version mit Ausgabe
quelle
sudo lsof
und meistens mit getestetping -c20 google.com
.Ich habe vor kurzem ein Tool gebaut, das diesen Zweck erfüllt. Es kann entweder als Wrapper oder automatisch mit Shell-Integration ausgeführt werden. Überprüfen Sie es hier: http://ntfy.rtfd.io
So installieren Sie es:
So verwenden Sie es als Wrapper:
Um Benachrichtigungen automatisch zu erhalten, fügen Sie diese zu Ihrem
.bashrc
oder hinzu.zshrc
:quelle
Ihr Skript funktioniert ganz gut, stellen Sie jedoch sicher, dass Sie die Zeile 'shebang' (
#!/bin/bash
) einfügen. Andere, die#!/bin/bash
hier erwähnt werden ,#!/bin/bash
funktionieren jedoch meistens gut für Unix-Bash-Skripte. Es wird vom Skriptinterpreter benötigt, damit er weiß, um welche Art von Skript es sich handelt.Dies scheint als Testskript zu funktionieren:
Um dieses Skript zu ändern, setzen Sie die Befehle an die Positionen
echo
undsleep
.Beachten Sie mit
notify-send
, dass Sie auch-i
ein Symbol angeben können :-)Stellen Sie außerdem sicher, dass es ausführbar ist, indem Sie
chmod +x /PATH/TO/FILE
es zuerst ausführen .quelle
Sie können Bash ändern, um die gewünschte Wrapper-Funktionalität zu implementieren.
Wenn Sie dazu neigen, viele derartige Änderungen an Ihrer interaktiven Shell vorzunehmen, können Sie in Erwägung ziehen, auf eine eigenhackbare Shell wie eshell zu wechseln, die mit Emacs elisp erstellt wurde und deren Anpassungsmöglichkeiten alle Erwägungen erfüllen:
http://www.masteringemacs.org/articles/2010/12/13/complete-guide-mastering-eshell/
quelle
Sie können dies auch mit einer einfachen if-Anweisung wie dieser tun
Sie können Ihre eigenen Variablennamen verwenden.
Ich kann bestätigen, dass dies funktioniert. Ich habe es mit einem Befehl getestet, dessen Beendigung lange dauert, und einem, der es nicht tut. Die Benachrichtigung wird für den Befehl gesendet, der lange dauert
Sie können dies auch mit jedem Befehl tun durch Ersetzen
ORIGINAL_COMMAND
mit$@
und Ausführen des Skripts wie./script command
.quelle
$((2+2))
ist eine Bash, die keine zusätzlichen Programme benötigt. Drittens: Es funktioniert nicht mit Befehlen, die Leerzeichen enthalten. tl; dr: es ist schlimmer als die anderen 1-jährigen Antworten