Rein bash
eingebaut, ohne Coreutils
Ich fand heraus, dass diese Lösung bash
auf einem eingebauten Befehl beruht, ohne eine externe ausführbare Datei aufzurufen. Es funktioniert auf Systemen, auf denen eventuell noch nicht einmal die Coreutils installiert wurden. [ 1 ]
YourCommand & read -t 300 ; kill $! # 1st version
YourCommand & read -t 300 || kill $! # 2nd version
Erläuterungen : wie immer , wenn Sie einen Befehl im Hintergrund senden mit &
, seine PID in die interne Variable gespeichert $!
(in der modernen Version von dash
, csh
, bash
, tcsh
, zsh
...).
Was wirklich den Unterschied zwischen den Shells ausmacht, ist das Vorhandensein des eingebauten Befehls read
[ 2 ] und der Option -t
. In der 1. Version wird der Befehl abgebrochen und ein Fehlerrückgabecode generiert, wenn der Benutzer eine Eingabezeile nicht vor der angegebenen Anzahl von Sekunden abschließt.
-t TIMEOUT Verursacht eine Zeitüberschreitung beim Lesen und gibt einen Fehler zurück, wenn eine vollständige Eingabezeile nicht innerhalb von TIMEOUT Sekunden gelesen wird.
Die zweite Version funktioniert wie die erste, aber Sie können die Abschaltzeit abbrechen, indem Sie einfach auf drücken enter.
In der Tat ||
führt der Operator oder die kill
Anweisung nur dann aus, wenn der read
Befehl mit einem von Null verschiedenen Rückkehrcode beendet wird, als wenn das Zeitlimit abgelaufen ist. Wenn Sie entervor diesem Moment drücken , wird 0 zurückgegeben und der vorherige Befehl wird nicht beendet.
Coreutils-Lösungen [ 1 ]
Wenn auf Ihrem System Coreutils vorhanden sind und Sie nicht die Zeit und die Ressourcen zum Aufrufen eines externen Programms sparen müssen, timeout
und sleep
beides perfekte Möglichkeiten, um Ihr Ziel zu erreichen.
timeout
Die Verwendung timeout
ist unkompliziert.
Möglicherweise können Sie auch die -k
Option verwenden, ein zusätzliches Kill-Signal zu senden, wenn das erste fehlschlägt.
timeout 5m YourCommand # 3rd version
sleep
Mit können sleep
Sie Ihre Fantasie nutzen oder sich inspirieren lassen [ 3 ] . Beachten Sie, dass Sie Ihren Befehl im Hintergrund oder im Vordergrund lassen können (z. B. muss top
normalerweise im Vordergrund sein).
YourCommand & sleep 5m; kill $! # 4th Background
YourCommand & pid=$! ; (sleep 5m; kill $pid;) & # 5th Background
bash -c '(sleep 5m; kill $$) & exec YourCommand' # 6th Foreground
(cmdpid=$BASHPID; (sleep 5m; kill $cmdpid) & exec YourCommand) # 7th Foreground
Erklärungen
- In der 4. Version führen Sie im Hintergrund
YourCommand
dann Ihre Shell sleep
s für 5 Minuten aus. Wenn es fertig ist, wird der letzte Hintergrundprozess ( $!
) abgebrochen. Sie stoppen Ihre Muschel.
-
In der 5. Version führen Sie stattdessen im Hintergrund aus
YourCommand
und speichern diese PID sofort in der Variablen $pid
. Anschließend führen Sie im Hintergrund ein Nickerchen von 5 Minuten und den darauf folgenden Befehl aus, mit dem die gespeicherte PID gelöscht wird. Da Sie diese Befehlsgruppe im Hintergrund gesendet haben, stoppen Sie Ihre Shell nicht. Sie müssen die PID in einer Variablen speichern, da der Wert von $!
durch eine eventuelle Ausführung eines anderen Programms im Hintergrund aktualisiert werden kann. Mit einfachen Worten vermeiden Sie das Risiko , den falschen oder gar keinen Prozess zu beenden.
- In der 6. Version heißt es eine neue Bash-Shell, die sich in 5 Minuten über selbst umbringt
$$
. Dann wird Ihr Befehl ausgeführt, der im Vordergrund bleibt.
- In der 7. Version wird eine Subshell aufgerufen
()
, die ihre PID in einer Variablen ( cmdpid
) speichert und sich mit einer anderen Subshell beendet, die im Hintergrund gesendet wird. Führen Sie dann YourCommand im Vordergrund aus.
Natürlich können Sie in jeder Version das Kill-Signal senden, das Sie benötigen, vom Standard-Signal bis zum Extrem- Signal kill -9
, um es nur dann zu verwenden, wenn es wirklich benötigt wird.
Verweise
- [ 1 ] Die Coreutils
- [ 2 ] Das Handbuch für Bash-Anfänger
- [ 3 ] Die BashFAQ