Diese Antwort auf den Befehlszeilenbefehl zum automatischen Beenden eines Befehls nach einer bestimmten Zeit
schlägt eine 1-zeilige Methode vor, um einen Befehl mit langer Laufzeit über die Bash-Befehlszeile zu deaktivieren:
( /path/to/slow command with options ) & sleep 5 ; kill $!
Es ist jedoch möglich, dass ein bestimmter "lang laufender" Befehl vor dem Timeout beendet wird. (Nennen wir es einen "normalerweise lang laufenden, aber manchmal schnellen" Befehl oder tlrbsf zum Spaß.)
Dieser raffinierte 1-Liner-Ansatz hat also einige Probleme. Erstens ist das sleep
nicht bedingt, so dass eine unerwünschte Untergrenze für die Zeit festgelegt wird, die für den Abschluss der Sequenz benötigt wird. Betrachten Sie 30s oder 2m oder sogar 5m für den Schlaf, wenn der Befehl tlrbsf in 2 Sekunden beendet ist - höchst unerwünscht. Zweitens ist das kill
unbedingt erforderlich, sodass diese Sequenz versucht, einen nicht laufenden Prozess zu beenden und darüber zu jammern.
So...
Gibt es eine Möglichkeit , einen normalerweise lang laufenden, aber manchmal schnellen Befehl ( "tlrbsf" ) zu umgehen?
- hat eine Bash-Implementierung (die andere Frage hat bereits Perl- und C-Antworten)
- wird am früheren der beiden beendet: tlrbsf- Programmbeendigung oder abgelaufenes Timeout
- tötet nicht vorhandene / nicht laufende Prozesse nicht ab (oder beschwert sich optional nicht über einen schlechten Kill)
- muss kein 1-Liner sein
- kann unter Cygwin oder Linux laufen
... und führt für Bonuspunkte den Befehl tlrbsf im Vordergrund und einen beliebigen "Schlaf" - oder zusätzlichen Prozess im Hintergrund aus, sodass der Befehl stdin / stdout / stderr des Befehls tlrbsf wie zuvor umgeleitet werden kann direkt laufen?
Wenn ja, teilen Sie bitte Ihren Code. Wenn nicht, erklären Sie bitte warum.
Ich habe eine Weile versucht, das oben genannte Beispiel zu hacken, aber ich stoße an die Grenze meiner Bash-Fähigkeiten.
timeout
Dienstprogramm gnu nicht zu verwenden ?
timeout
ist toll! Sie können sogar mehrere Befehle verwenden (mehrzeiliges Skript): stackoverflow.com/a/61888916/658497