Diese Antwort まで Kommandozeilenbefehl zum automatischen Beenden eines Befehls nach einer bestimmten Zeitspanne
schlägt eine 1-Zeilen-Methode vor, um einen lang laufenden Befehl in der Bash-Kommandozeile zu unterbrechen:
( /path/to/slow command with options ) & sleep 5 ; kill $!
Es ist jedoch möglich, dass ein bestimmter "langlaufender" Befehl früher endet als die Zeitüberschreitung.
(Nennen wir es einen "typisch-lang-laufenden-aber-manchmal-schnellen" Befehl, oder tlrbsf zum Spaß).
Dieser elegante Einzeiler hat also ein paar Probleme.
Erstens, die sleep
ist nicht an Bedingungen geknüpft, was zu einer unerwünschten Untergrenze der Zeit führt, die für die Beendigung der Sequenz benötigt wird. Ziehen Sie 30s oder 2m oder sogar 5m für den Schlaf in Betracht, wenn die tlrbsf Befehl ist in 2 Sekunden beendet - höchst unerwünscht.
Zweitens, die kill
ist nicht an Bedingungen geknüpft, so dass diese Sequenz versuchen wird, einen nicht laufenden Prozess zu beenden und sich darüber beschweren wird.
Also...
Gibt es eine Möglichkeit um eine typischerweise lange laufende, aber manchmal schnelle ( "tlrbsf" ) den Befehl
- hat eine Bash-Implementierung (die andere Frage wurde bereits mit Perl und C beantwortet)
- endet mit dem früheren der beiden Zeitpunkte: tlrbsf Programmabbruch oder Timeout verstrichen
- wird nicht existierende/nicht laufende Prozesse nicht beenden (oder, optional: wird nicht beschweren über eine schlechte Tötung)
- muss kein Einzeiler sein
- kann unter Cygwin oder Linux laufen
... und, für Bonuspunkte
- läuft die tlrbsf Befehl im Vordergrund
- jeder "Ruhezustand" oder zusätzliche Prozess im Hintergrund
so, dass die stdin/stdout/stderr des tlrbsf Befehl umgeleitet werden kann, so als ob er direkt ausgeführt worden wäre?
Wenn ja, teilen Sie bitte Ihren Code mit. Wenn nicht, erklären Sie bitte warum.
Ich habe eine Weile versucht, das oben genannte Beispiel zu hacken, aber ich stoße an die Grenzen meiner Bash-Kenntnisse.