Der Code
Speichern Sie dies als tkill
(machen Sie es ausführbar und passen Sie es PATH
ggf. an):
#!/bin/bash _terminate_children() { trap "exit 143" SIGTERM && kill -- -$$ } trap _terminate_children SIGINT SIGTERM tout="$1" shift eval $@ | tee >(while :; do read -t "$tout" case $? in 0) : ;; 1) break ;; *) _terminate_children ;; esac done) exit $
Grundlegende Verwendung
tkill 30 some_command
Das erste Argument ( 30
hier) ist das Timeout in Sekunden.
Anmerkungen
tkill
erwartetsome_command
eine Textausgabe (nicht binär).tkill
Sondenstdout
des gegebenen Befehls. Um auchstderr
umleiten es wie im letzten fortgeschrittenen Beispiel unten.
Erweiterte Nutzung
Dies sind gültige Beispiele:
tkill 9 foo -option value tkill 9 "foo -option value" # equivalent to the above tkill 5 "foo | bar" tkill 5 'foo | bar' tkill 5 'foo | bar | baz' # tkill monitors baz tkill 5 'foo | bar' | baz # baz reads from tkill tkill 3 "foo; bar" tkill 6 "foo && bar || baz" tkill 7 "some_command 2>&1"
Verwenden Sie die Bash-Syntax in diesen Anführungszeichen.
Status beenden
- Wenn
some_command
Exits von selbst beendet werden, wird der Exitstatus als Exitstatus von verwendettkill
.tkill 5 true
kehrt zurück0
;tkill 5 false
kehrt zurück1
;tkill 5 "true; false"
kehrt zurück1
. - Wenn das angegebene Timeout abläuft oder
tkill
unterbrochen wirdSIGINT
oderSIGTERM
der Exit-Status lautet, wird der Exit-Status angezeigt143
.
Code-Fragmente erklärt
eval
macht die fortgeschrittenen Beispiele möglich.tee
erlaubt uns zu analysieren,stdin
während wir noch eine Kopie davon übergebenstdout
.read -t
Ist für die Anwendung des Timeouts verantwortlich, wird anhand seines Exit-Status festgelegt, was als Nächstes zu tun ist.- Überwachte Befehle werden bei dieser Lösung abgebrochen, wenn dies erforderlich ist .
- Der Beendigungsstatus der überwachten Befehle wird mit dieser Lösung abgerufen .