Czy w wierszu poleceń systemu Linux można powtarzać polecenie co n sekund?
Powiedzmy, że mam importowanie i robię
ls -l
aby sprawdzić, czy rozmiar pliku rośnie. Chciałbym mieć polecenie automatycznego powtórzenia tego.
Czy w wierszu poleceń systemu Linux można powtarzać polecenie co n sekund?
Powiedzmy, że mam importowanie i robię
ls -l
aby sprawdzić, czy rozmiar pliku rośnie. Chciałbym mieć polecenie automatycznego powtórzenia tego.
Odpowiedzi:
Oglądaj co 5 sekund ...
watch -n 5 ls -l
Jeśli chcesz mieć wizualne potwierdzenie zmian, dołącz --differences
przed ls
poleceniem.
Według strony podręcznika OSX jest też
Opcja --cumulative sprawia, że podświetlanie jest „lepkie”, co pokazuje bieżące wyświetlanie wszystkich pozycji, które kiedykolwiek się zmieniły. Opcja -t lub --no-title wyłącza nagłówek pokazujący interwał, polecenie i aktualny czas w górnej części wyświetlacza, a także następujący pusty wiersz.
Strona podręcznika Linux / Unix można znaleźć tutaj
watch mysql dbname -e \"show processlist\;\"
brew install watch
while true; do
sleep 5
ls -l
done
watch
ma również niefortunny efekt uboczny czyszczenia ekranu, więc czasami pętla jest przydatna. Które użyć zależy od pożądanego formatu danych wyjściowych.
--differences
aby je podświetlić (Jeśli
watch
. Watch nie działa na przykład, gdy chcesz wygenerować losową liczbę przy każdym wywołaniu, np watch -n 1 echo ${RANDOM}
. Losowy zostanie wywołany tylko raz.
„watch” nie pozwala ułamkom sekund na Busybox, podczas gdy „sleep” tak. Jeśli to dla Ciebie ważne, spróbuj tego:
while true; do ls -l; sleep .5; done
sleep
już powraca 0
. Jako taki używam:
while sleep 3 ; do ls -l ; done
To jest trochę krótsze niż rozwiązanie Michaiła. Niewielką wadą jest to, że śpi przed uruchomieniem polecenia docelowego po raz pierwszy.
Jeśli polecenie zawiera niektóre znaki specjalne, takie jak potoki i cudzysłowy, należy je uzupełnić cudzysłowami. Na przykład, aby powtórzyć ls -l | grep "txt"
, polecenie watch powinno być:
watch -n 5 'ls -l | grep "txt"'
Uruchamianie poleceń okresowo bez crona jest możliwe, gdy zaczynamy while
.
Jako polecenie:
while true ; do command ; sleep 100 ; done &
[ ex: # while true; do echo `date` ; sleep 2 ; done & ]
Przykład:
while true
do echo "Hello World"
sleep 100
done &
Nie zapomnij ostatniego, &
ponieważ spowoduje to umieszczenie pętli w tle. Ale musisz znaleźć identyfikator procesu za pomocą polecenia „ps -ef | grep your_script”, a następnie musisz go zabić. Dlatego uprzejmie dodaj znak „&” podczas uruchamiania skryptu.
# ./while_check.sh &
Oto ta sama pętla co skrypt. Utwórz plik „while_check.sh” i umieść w nim:
#!/bin/bash
while true; do
echo "Hello World" # Substitute this line for whatever command you want.
sleep 100
done
Następnie uruchom go, wpisując bash ./while_check.sh &
echo $!
po każdym uruchomieniu procesu w tle - jest to PID ostatniego procesu potomnego uruchomionego w tle.
echo `date`
jest po prostu kiepskim i nieco błędnym sposobem pisania date
. (Błąd ma związek z brakiem cytowania argumentu echo
.) Zobacz także bezużyteczne użycie echo
.
Jeśli chcesz uniknąć „dryfowania”, co oznacza, że chcesz, aby polecenie było wykonywane co N sekund, niezależnie od tego, jak długo trwa to polecenie (zakładając, że zajmuje mniej niż N sekund), oto kilka słów kluczowych, które będą powtarzać polecenie co 5 sekund z jednym- druga dokładność (i wydrukuje ostrzeżenie, jeśli nie będzie w stanie nadążyć):
PERIOD=5
while [ 1 ]
do
let lastup=`date +%s`
# do command
let diff=`date +%s`-$lastup
if [ "$diff" -lt "$PERIOD" ]
then
sleep $(($PERIOD-$diff))
elif [ "$diff" -gt "$PERIOD" ]
then
echo "Command took longer than iteration period of $PERIOD seconds!"
fi
done
Może nadal nieco dryfować, ponieważ sen jest dokładny tylko do jednej sekundy. Możesz poprawić tę dokładność, twórczo wykorzystując polecenie daty.
Jeśli chcesz zrobić coś określoną liczbę razy, zawsze możesz to zrobić:
repeat 300 do my first command here && sleep 1.5
for x in {1..300} ; do
polecenia ||break;sleep 1.5; done
Możesz uruchomić następujące i filtrować tylko rozmiar. Jeśli plik został wywołany somefilename
, możesz wykonać następujące czynności
while :; do ls -lh | awk '/some*/{print $5}'; sleep 5; done
Jeden z wielu pomysłów.
Aby łatwiej zminimalizować dryf, użyj:
while :; do sleep 1m & some-command; wait; done
nadal będzie niewielki dryf z powodu czasu basha na uruchomienie struktury pętli i polecenia uśpienia, aby faktycznie wykonać.
wskazówka: „:” zmienia się na 0, tzn. prawda.
watch -n 5 'ls -l
Uruchamia ls -l
polecenie po każdych 5 sekundach
Every 5.0s: ls -l Fri Nov 17 16:28:25 2017
total 169548
-rw-rw-r-- 1 sachin sachin 4292 Oct 18 12:16 About_us_Admission.doc
-rw-rw-r-- 1 sachin sachin 865 Oct 13 15:26 About_us_At_glance.doc
-rw-rw-r-- 1 sachin sachin 1816 Oct 13 16:11 About_us_Principle.doc
-rw-rw-r-- 1 sachin sachin 1775 Oct 13 15:59 About_us_Vission_mission.doc
-rw-rw-r-- 1 sachin sachin 1970 Oct 13 16:41 Academic_Middle_school.doc
-rw-rw-r-- 1 sachin sachin 772 Oct 16 16:07 academics_High_School.doc
-rw-rw-r-- 1 sachin sachin 648 Oct 16 13:34 academics_pre_primary.doc
-rw-rw-r-- 1 sachin sachin 708 Oct 16 13:39 academics_primary.doc
-rwxrwxr-x 1 sachin sachin 8816 Nov 1 12:10 a.out
-rw-rw-r-- 1 sachin sachin 23956 Oct 23 18:14 Ass1.c++
-rw-rw-r-- 1 sachin sachin 342 Oct 23 22:13 Ass2.doc
drwxrwxr-x 2 sachin sachin 4096 Oct 19 10:45 Backtracking
drwxrwxr-x 3 sachin sachin 4096 Sep 23 20:09 BeautifulSoup
drwxrwxr-x 2 sachin sachin 4096 Nov 2 00:18 CL_1
drwxrwxr-x 2 sachin sachin 4096 Oct 23 20:16 Code
drwxr-xr-x 2 sachin sachin 4096 Nov 15 12:05 Desktop
-rw-rw-r-- 1 sachin sachin 0 Oct 13 23:12 doc
drwxr-xr-x 4 sachin sachin 4096 Nov 6 21:18 Documents
drwxr-xr-x 27 sachin sachin 12288 Nov 17 13:23 Downloads
-rw-r--r-- 1 sachin sachin 8980 Sep 19 23:58 examples.desktop
Zwięzłe rozwiązanie, które jest szczególnie przydatne, jeśli chcesz wielokrotnie uruchamiać polecenie, dopóki się nie powiedzie, i pozwala zobaczyć wszystkie dane wyjściowe.
while ls -l; do
sleep 5
done