Jak mogę powtarzać polecenie w każdym przedziale czasu, aby umożliwić mi uruchamianie poleceń w celu sprawdzenia lub monitorowania katalogów?
Skrypt nie jest potrzebny, potrzebuję tylko prostej komendy do wykonania w terminalu.
Jak mogę powtarzać polecenie w każdym przedziale czasu, aby umożliwić mi uruchamianie poleceń w celu sprawdzenia lub monitorowania katalogów?
Skrypt nie jest potrzebny, potrzebuję tylko prostej komendy do wykonania w terminalu.
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 -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
.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 zwatch
narzędzia jest o wiele czystsze!Możesz także użyć tego polecenia w terminalu, oprócz odpowiedzi nux:
Przykład
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ściepygmentize
będzie działać, ale nie powiedzie sięls --color=auto
.W powyższych okolicznościach może się to wydawać lepszą opcją.
źródło
watch
istnieje dla tego, to jest trochę bezużyteczne powiedziałbymwatch
jest dobry w większości przypadków. Dlatego na początku wspomniałem „oprócz odpowiedzi Nux”. Ale z kilkoma problemami jestwatch
na przykład Nie można używać żadnych aliasowanych poleceńwatch
. Weźmy na przykładll
alias,ls -laF
ale nie można go używać zwatch
. 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 woliszwhile 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.źródło
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
isleep
złamie tylko jeśli zabijesztrue
.Brzmi jak idealne zadanie dla
cron
demona, które pozwala na uruchamianie okresowych poleceń. Uruchomcrontab -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:Na przykład, jeśli chcesz uruchamiać skrypt w języku Python w każdy wtorek, o 11:00:
Istnieją również specjalne nazwy, które zastępują czas, np
@reboot
. Bardzo pomocne, jeśli chcesz utworzyć katalog tymczasowy. Z mojego crontab (wymienionego zcrontab -l
):źródło
cron
biegnie za kulisami, a nie w terminaluJeś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:
Następnie w drugim terminalu dowolne polecenie, które wpływa na bieżący katalog,
Następnie w oryginalnym terminalu inotifywait obudzi się i zgłosi zdarzenie
Lub w pętli
źródło
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:Po drugie, wklej te linie na dole pliku i zapisz:
Po trzecie, zamknij i ponownie otwórz terminal lub wpisz:
Gotowe ! Możesz teraz używać tego w następujący sposób:
lub
źródło
możesz użyć crontab. uruchom polecenie
crontab -e
i otwórz je za pomocą preferowanego edytora tekstu, a następnie dodaj ten wierszSpowoduje to uruchomienie polecenia co 10 minut
Spowoduje to uruchomienie polecenia co 4 godziny
Inne możliwe rozwiązanie
X liczbę powtórzeń.
Y czas oczekiwania powtórzyć.
Przykład:
źródło
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.
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:
Spowoduje to wygenerowanie:
Jak widać, polecenie jest uruchamiane co minutę:
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:
źródło