Jeśli wykonuję długi proces, czy jest jakiś sposób na wykonanie niektórych poleceń opartych na czasie?
Na przykład uruchamiam naprawdę długi proces, który trwa około 10 minut.
Po 5 minutach chciałbym uruchomić osobne polecenie. Na przykład osobnym poleceniem może być:echo 5 minutes complete
(Uwaga: nie chcę postępu w realizacji polecenia, ale po prostu polecenia wykonywane po określonych odstępach czasu).
Czy to możliwe?
shell-script
shell
delay
Aniket Bhattacharyea
źródło
źródło
longcommand & sleep 300 && command-to-do-after-five-minutes
? (Właściwie to prawdopodobnie tego szukasz). Zauważ, że twoje wyjaśnienie nie było wystarczające, ponieważ od razu otrzymałeś dwie implementacje paska postępu zegara.Odpowiedzi:
Po prostu biegnij:
Uruchomi
do-this-after-five-minutes
się po pięciu minutach.long-command
Zostanie uruchomiony w tle.źródło
sleep 5m && foobar
, więc jeśli zmienię zdanie i ^ Csleep
, następne polecenie nie zostanie uruchomione.sleep 3; ls
I^C
, drugie polecenie i tak nie działa. Nie bardzo wiem, dlaczego i może działa inaczej w nieinteraktywnej powłoce?sleep 5m && echo
śpi, kiedy się zawieszasz, tylkosleep
polecenie jest zawieszone. Reszta wiersza poleceń jest uruchomiona, ale ponieważsleep
została zawieszona, nie zakończyła się pomyślnie, a część po nim&&
została pominięta. Spróbuj zawiesićsleep 5 || echo hello
ihello
pokazuje się bezpośrednio po naciśnięciu^Z
.at(1)
, do takich rzeczy jaksleep 30m && mplayer something.mp3
przypomnienie o alarmie lubsleep 90m && fg
do wznowienia polecenia wymagającego dużej ilości dysku. Tak naprawdęsleep 5m && echo hello
jest fajne, ponieważ^Z
zawiesza sięsleep
bez uruchamiania następującego polecenia. Jeśli chcesz móc zawiesić / wznowić całą komendę złożoną, nawet przed wyjściem z trybu uśpienia, użyj( sleep 2 && echo hello )
.&&
idiom pozwala być absolutnie pewnym, że nie zabijesz procesu zaraz po uruchomieniu trybu uśpienia (ponieważ nie możesz^Z
uruchomić polecenia, zamiast ryzykować a^C
). Jest to przydatne w przypadkusleep && fg
lub wsleep && bg
przypadku użycia, gdy wznawiane polecenie jest częściowo realizowane przez coś powolnego.Możesz użyć tego skryptu:
Wykonuje twój
longprocess
w,sub-shell
a następnie monitoruje wcześniej utworzony plik blokady.źródło
man bash
zaSECONDS
. Możesz ustawićSECONDS=0
na początku skryptu i tylko sprawdzić, czy jest większy lub równy 300, lub ustawićSECONDS=$((date +%s))
i zapomnieć odate
ponownym użyciu w skrypcie ...sleep 1s
byciu dokładnie o jedną sekundę później niż wcześniejsleep 1s
... to padłeś ofiarą Falsehoods, które programiści wierzą w czas . (Chociaż w tym przypadku równie dobrze możesz po prostu pokazać pasek postępu znaku skrótu lub coś takiego.)sleep
!SECONDS
! :)Jest do tego jedna linijka:
W twoim przypadku TIMEOUT = 5m, a POLECENIE jest długim poleceniem.
Zobacz także moją odpowiedź na ten post Limit czasu z „restartem sieci serwisowej”
źródło
jobs %1
kończy się niepowodzeniem po zatrzymaniu zadania% 1.Pamiętaj, że w dłuższych czasach $ sekundy mogą nie być zsynchronizowane z czasem rzeczywistym. Lepiej zapisać czas rozpoczęcia i obliczyć różnicę do czasu rzeczywistego.
źródło