Alarm nach langem Laufen des Shell-Skripts


7

Wenn ich auf langsame Befehle gewartet habe (z. B. Operationen an großen Datenbanken), fange ich an, etwas anderes zu tun, und merke oft nicht lange, dass es beendet ist, und verschwende wertvolle Zeit. Ich suche nach einer Möglichkeit für die Shell, mich zu warnen (was bedeutet, dass Sie einen benutzerdefinierten Befehl ausführen, den ich bestimmen kann), wenn ein Befehl beendet wurde, der länger als X Sekunden ausgeführt wurde, und ich die Eingabeaufforderung zurückerhalten habe.

Ich benutze Bash, aber auch Lösungen für andere Shells wären interessant.


Antworten:


11

Dieses Skript, wenn in Ihr .bashrc, führt jeden Befehl aus, der Ihnen gefällt, wenn die Eingabeaufforderung nach längerer Ausführung eines Befehls zurückgegeben wird - passen Sie die "lange Zeit" an (nach dem -gt ) in Sekunden, und innerhalb der geschweiften Klammern in derselben Zeile können Sie beliebige Befehle ausführen. Sie können sich sogar eine E-Mail mit dem Host senden, auf der dies geschehen ist, sowie den zuletzt ausgeführten Befehl und den Statuscode.

beep_if_long_time_past() {
    LAST_COMMAND_DURATION=$(($(date +%s) - ${LAST_COMMAND_TIME}))
    [[ ${LAST_COMMAND_DURATION} -gt 60 ]] && { echo "Took long, didn't it?" ; notify-send "I'm done after ${LAST_COMMAND_DURATION} seconds!"; }
    export LAST_COMMAND_TIME=
}

export PROMPT_COMMAND=beep_if_long_time_past
trap '[ -z ${LAST_COMMAND_TIME} ] && export LAST_COMMAND_TIME=$(date +%s)' DEBUG

Das funktioniert super, danke. Ich blieb dabei echo -e "\a" was gut mit PuTTY funktioniert (Sie können es so konfigurieren, dass das Taskleistensymbol blinkt, anstatt einen Ton zu geben).
Tgr

Leider bricht dies in MC-Subshells ( MC-Fehler Nr. 2027 ).
Tgr

6
slowcommand; echo -e "\a"

Funktioniert, aber es ist hässlich und unpraktisch, den Benachrichtigungsbefehl jedes Mal manuell anzufügen. auch leicht zu vergessen. (Mit kann eine Benachrichtigung an einen bereits laufenden Prozess angehängt werden wait wie Diese Antwort erklärt , aber das ist noch hässlicher.)


2

Ich verwende normalerweise eine Popup-Benachrichtigung. xmessage tendenziell verfügbar:

slowcommand; xmessage -center 'Job done!'

Oder fügen Sie eine Erinnerung hinzu (abhängig von der atd Daemon):

echo 'xmessage -display :0 -center "Check on job"' | at 'now + 10 minutes'
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.