Odpowiedzi:
Możesz użyć watch
polecenia, zegarek służy do uruchamiania dowolnego wyznaczonego polecenia w regularnych odstępach czasu.
Otwórz terminal i wpisz:
watch -n x <your command>
zmień x na żądany czas w sekundach.
Aby uzyskać dodatkową pomoc w korzystaniu z watch
polecenia i jego opcji, uruchom man watch
lub odwiedź ten link .
Na przykład: co 60. na tym samym terminalu będzie wyświetlana zawartość katalogu Desktop, aby można było wiedzieć, czy nastąpiły jakieś zmiany:
watch -n 60 ls -l ~/Desktop
watch
polecenia typu „włączona historia”? Uwielbiam używać watch
, ale czasami wolałbym zobaczyć dziennik poprzednich wykonań, zamiast tylko ostatniego. I tak, wiem, że mogę to zrobić za pomocą skryptów ( while true
), ale korzystanie z watch
narzędzia jest o wiele czystsze!
Możesz także użyć tego polecenia w terminalu, oprócz odpowiedzi nux:
while true; do <your_command>; sleep <interval_in_seconds>; done
Przykład
while true; do ls; sleep 2; done
To polecenie wydrukuje wydruk ls
w odstępie 2 sekund.
Użyj Ctrl+, Caby zatrzymać proces.
Istnieje kilka wad watch
watch
zinterpretuje sekwencje kolorów ANSI przekazując znaki zmiany znaczenia za pomocą -c
lub --color
. Na przykład wyjście pygmentize
będzie działać, ale nie powiedzie się ls --color=auto
.W powyższych okolicznościach może się to wydawać lepszą opcją.
watch
istnieje dla tego, to jest trochę bezużyteczne powiedziałbym
watch
jest dobry w większości przypadków. Dlatego na początku wspomniałem „oprócz odpowiedzi Nux”. Ale z kilkoma problemami jest watch
na przykład Nie można używać żadnych aliasowanych poleceńwatch
. Weźmy na przykład ll
alias, ls -laF
ale nie można go używać z watch
. Również w przypadku, gdy wyjście dowolnego polecenia jest dość długie, będziesz mieć problemy z przewijaniem za pomocą watch
. W tych kilku szczególnych przypadkach odpowiedź ta może wydawać się lepszą opcją.
watch
co najmniej zezwala na opcje -c
lub --color
dla kolorowych wyników.
while sleep x
jest lepszy - łatwiej zabijać.
watch
, pozwala zachować historię poleceń.
Chciałem tylko dodać odpowiedzi do souravc i nux :
watch
będzie działał idealnie na Ubuntu, możesz tego uniknąć, jeśli chcesz, aby Twój „Unix-fu” był czysty - na przykład na FreeBSD, watch to polecenie „szpiegować na innej linii tty”.while true; do command; sleep SECONDS; done
posiada również zastrzeżenie - to polecenie może być trudniejsze do zabicia za pomocą CTR + C . Może wolisz while sleep SECONDS; do command; done
- jest nie tylko krótszy, ale także łatwiejszy do przerwania. Zastrzeżenie polega na tym, że najpierw będzie spało, a następnie uruchomi polecenie, więc musisz poczekać, SECONDS
zanim nastąpi pierwsze wystąpienie polecenia.sleep
miejscu znajduje się while
pętla? Nie mogłem znaleźć żadnej różnicy, Ctrl + C natychmiast przerwał pętlę, bez względu na wszystko.
command
i sleep
złamie tylko jeśli zabijesz true
.
Brzmi jak idealne zadanie dla cron
demona, które pozwala na uruchamianie okresowych poleceń. Uruchom crontab -e
polecenie, aby rozpocząć edycję konfiguracji crona użytkownika. Jego format jest udokumentowany w crontab (5) . Zasadniczo masz pięć powiązanych z czasem, oddzielonych spacjami pól, po których następuje polecenie:
The time and date fields are:
field allowed values
----- --------------
minute 0-59
hour 0-23
day of month 1-31
month 1-12 (or names, see below)
day of week 0-7 (0 or 7 is Sunday, or use names)
Na przykład, jeśli chcesz uruchamiać skrypt w języku Python w każdy wtorek, o 11:00:
0 11 * * 1 python ~/yourscript.py
Istnieją również specjalne nazwy, które zastępują czas, np @reboot
. Bardzo pomocne, jeśli chcesz utworzyć katalog tymczasowy. Z mojego crontab (wymienionego z crontab -l
):
# Creates a temporary directory for ~/.distcc at boot
@reboot ln -sfn "$(mktemp -d "/tmp/distcc.XXXXXXXX")" "$HOME/.distcc"
cron
biegnie za kulisami, a nie w terminalu
Jeśli monitorujesz system plików, to inotifywait
jest genialny i z pewnością powoduje mniejsze obciążenie systemu.
Przykład:
W 1. terminalu wpisz to polecenie:
$ inotifywait .
Następnie w drugim terminalu dowolne polecenie, które wpływa na bieżący katalog,
$ touch newfile
Następnie w oryginalnym terminalu inotifywait obudzi się i zgłosi zdarzenie
./ CREATE newfile2
Lub w pętli
$ while true ; do inotifywait . ; done
Setting up watches.
Watches established.
./ OPEN newfile2
Setting up watches.
Watches established.
./ OPEN newfile2
Setting up watches.
Watches established.
./ DELETE newfile
Setting up watches.
Watches established.
./ CREATE,ISDIR newdir
Setting up watches.
Watches established.
grep something InALogFile|less
to skrypt?
.
nie mogę pominąć polecenia.
-m
aby stale monitorować bez pętli.
Możesz utworzyć własne repeat
polecenie, wykonując następujące kroki; kredyty tutaj :
Najpierw otwórz .bash_aliases
plik:
$ xdg-open ~/.bash-aliases
Po drugie, wklej te linie na dole pliku i zapisz:
repeat() {
n=$1
shift
while [ $(( n -= 1 )) -ge 0 ]
do
"$@"
done
}
Po trzecie, zamknij i ponownie otwórz terminal lub wpisz:
$ source ~/.bash_aliases
Gotowe ! Możesz teraz używać tego w następujący sposób:
$ repeat 5 echo Hello World !!!
lub
$ repeat 5 ./myscript.sh
możesz użyć crontab. uruchom polecenie crontab -e
i otwórz je za pomocą preferowanego edytora tekstu, a następnie dodaj ten wiersz
*/10 * * * * /path-to-your-command
Spowoduje to uruchomienie polecenia co 10 minut
* */4 * * * /path-to-your-command
Spowoduje to uruchomienie polecenia co 4 godziny
$ ..some command...; for i in $(seq X); do $cmd; sleep Y; done
X liczbę powtórzeń.
Y czas oczekiwania powtórzyć.
Przykład:
$ echo; for i in $(seq 5); do $cmd "This is echo number: $i"; sleep 1;done
Innym problemem związanym z zaproponowanym powyżej podejściem „obserwuj” jest to, że wyświetla wynik dopiero po zakończeniu procesu. „date; sleep 58; date” wyświetli 2 daty dopiero po 59 sekundach ... Jeśli zaczniesz coś działać przez 4 minuty, które wyświetlają powoli wiele stron treści, tak naprawdę nie zobaczysz.
Z drugiej strony, problem związany z podejściem „while” polega na tym, że nie bierze on pod uwagę czasu trwania zadania.
while true; do script_that_take_between_10s_to_50s.sh; sleep 50; done
Dzięki temu skrypt będzie uruchamiany co minutę, czasem może zająć 1m40. Więc nawet jeśli cron będzie mógł uruchamiać go co minutę, tutaj nie będzie.
Aby więc zobaczyć wynik w powłoce podczas generowania i poczekać na dokładny czas żądania, musisz spojrzeć na czas przed i po oraz zapętlić się z chwilą.
Coś jak:
while ( true ); do
echo Date starting `date`
before=`date +%s`
sleep `echo $(( ( RANDOM % 30 ) + 1 ))`
echo Before waiting `date`
after=`date +%s`
DELAY=`echo "60-($after-$before)" | bc`
sleep $DELAY
echo Done waiting `date`
done
Spowoduje to wygenerowanie:
Jak widać, polecenie jest uruchamiane co minutę:
Date starting Mon Dec 14 15:49:34 EST 2015
Before waiting Mon Dec 14 15:49:52 EST 2015
Done waiting Mon Dec 14 15:50:34 EST 2015
Date starting Mon Dec 14 15:50:34 EST 2015
Before waiting Mon Dec 14 15:50:39 EST 2015
Done waiting Mon Dec 14 15:51:34 EST 2015
Więc po prostu zamień echo $(( ( RANDOM % 30 ) + 1 ))
komendę „uśpienie ” na to, co chcesz, i będzie ono uruchamiane na terminalu / powłoce dokładnie co minutę. Jeśli chcesz mieć inny harmonogram, po prostu zmień „60” sekund na to, czego potrzebujesz.
Krótsza wersja bez linii debugowania:
while ( true ); do
before=`date +%s`
sleep `echo $(( ( RANDOM % 30 ) + 1 ))` # Place you command here
after=`date +%s`
DELAY=`echo "60-($after-$before)" | bc`
sleep $DELAY
done
watch -n 1 'echo $COLUMNS'
iwatch -n 1 echo $COLUMNS
podczas zmiany rozmiaru terminala - ten pierwszy jest rozwijany co sekundę, ale drugi jest rozszerzany tylko raz przed uruchomieniemwatch
.