Ta odpowiedź na polecenie wiersza polecenia, aby automatycznie zabić polecenie po pewnym czasie
proponuje 1-liniową metodę przekroczenia limitu długo działającego polecenia z linii poleceń bash:
( /path/to/slow command with options ) & sleep 5 ; kill $!
Ale możliwe jest, że dane polecenie „długo działające” może zakończyć się przed upływem limitu czasu. (Nazwijmy to „zwykle długo działającym, ale czasem szybkim” poleceniem lub tlrbsf dla zabawy).
Więc to fajne podejście 1-liniowe ma kilka problemów. Po pierwsze, sleep
nie jest warunkowy, więc ustawia niepożądaną dolną granicę czasu potrzebnego na zakończenie sekwencji. Rozważ 30s, 2m lub nawet 5m na sen, kiedy komenda tlrbsf kończy się w ciągu 2 sekund - wysoce niepożądane. Po drugie, kill
jest bezwarunkowe, więc ta sekwencja będzie próbowała zabić niedziałający proces i narzekać na ten temat.
Więc...
Czy istnieje sposób na przekroczenie limitu czasu przez zwykle długo działające, ale czasem szybkie ( „tlrbsf” ) polecenie, które
- ma implementację bash (inne pytanie ma już odpowiedzi w Perlu i C)
- zakończy się wcześniejszym z dwóch: zakończenie programu tlrbsf lub upłynął limit czasu
- nie zabije nieistniejących / niedziałających procesów (lub opcjonalnie: nie narzeka na złe zabicie)
- nie musi być liniowcem 1-liniowym
- może działać pod Cygwin lub Linux
... a dla punktów bonusowych uruchamia komendę tlrbsf na pierwszym planie i dowolny proces „uśpienia” lub dodatkowy proces w tle, tak że stdin / stdout / stderr komendy tlrbsf może zostać przekierowany, tak jakby był uruchomić bezpośrednio?
Jeśli tak, udostępnij swój kod. Jeśli nie, proszę wyjaśnić dlaczego.
Spędziłem trochę czasu próbując zhakować powyższy przykład, ale osiągam limit moich umiejętności bashowych.
timeout
narzędzia GNU ?
timeout
jest świetne! możesz nawet używać wielu poleceń (skrypt wieloliniowy): stackoverflow.com/a/61888916/658497