Chcę wykonać polecenie co 10 sekund i wykonać je w tle (eliminując w ten sposób watch
?). Wszystkie odpowiedzi pokazują coś podobnego do poniższego, ale będzie to działać zawsze od 11 do 14 sekund. Jak można tego dokonać?
while true; do
# perform command that takes between 1 and 4 seconds
sleep 10
done
Odpowiedzi:
Co powiesz na:
ETA: Z tymi wszystkimi komentarzami, alternatywami i podpowłoką dla dodatkowej ochrony, która wygląda o wiele bardziej skomplikowana niż się zaczęła. Dla porównania, oto jak to wyglądało, zanim zacząłem się martwić
wait
lubkill
, wraz z ich$!
potrzebą izolacji:Reszta jest naprawdę tylko wtedy, gdy jej potrzebujesz.
źródło
$!
: „rozwija się do identyfikatora procesu zadania ostatnio umieszczonego w tle” isleep
nie jest umieszczany w tle, więc nie, nie będzie. :)Można zrobić coś jak następuje w
bash
,zsh
lubksh
:Oto, co
bash
mówi instrukcja$SECONDS
:Oto działający przykład:
źródło
SECONDS
wykonajsleep "$((10-(($SECONDS-$start_time)%10)))"
. Musisz zrobićstart_time=$SECONDS
przed pętlą.SECONDS
. Odrodzenie podpowłoki jak w twojej ostatniej edycji, powinno również uniknąć tego problemu.while true
pętli, nie spodziewałem się, że jakikolwiek stan powłoki przetrwa. Tak czy inaczej, owijanie takiej pętli we własny kontekst jest zwykle najlepszą praktyką. W takiej sytuacji byłbym bardziej zaniepokojony robieniem tego dla samegotrap
siebie niż dla samego$SECONDS
siebie.Tylko BASH - Możesz również obliczyć czas spędzony przez twoje polecenie i odjąć od 10:
Od BASH człowieka:
źródło