Powtórz polecenie automatycznie w systemie Linux


303

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:


541

Oglądaj co 5 sekund ...

watch -n 5 ls -l

Jeśli chcesz mieć wizualne potwierdzenie zmian, dołącz --differencesprzed lspoleceniem.

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


4
Fajnie - szkoda, że ​​nie dołącza wyników do linii poleceń
Marty Wallace,

1
Dodano opcję odpowiedzi, która pozwala wyróżnić zmiany
Rawkode,

3
Pamiętaj, że musisz uciec od znaków specjalnych, które są częścią komendy, którą oglądasz, na przykład: watch mysql dbname -e \"show processlist\;\"
pfrenssen

11
brew install watch
Josh Unger

1
zegarek nie jest zainstalowany w systemie Mac OS X 10.10
João Nunes,

118
while true; do
    sleep 5
    ls -l
done

10
watchma 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.
William Pursell

Zazwyczaj robię pętlę, ale robię to w jednej linii. Zegarek wygląda jednak znacznie lepiej, muszę się na to przełączyć.
Don Branson

1
@MartyWallace Można to zrobić za pomocą wiersza poleceń (pętla while).
keyser

Warto zauważyć, że możesz użyć ich, --differencesaby je podświetlić (Jeśli
martwisz

To jest lepsze niż 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.
Marcin

92

„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

1
Jest to przydatne, gdy trzeba gdzieś przesłać dane wyjściowe (np. Rekurencyjne dla kreski)
Stephen Smith

1
Dzięki. Działa to w przypadku konsol busy busy, które nie mają polecenia watch. Użyłem go do zmierzenia czasu pracy mojego systemu: chociaż jest to prawda; zrobić uptime; spać 1; zrobione
Santiago Villafuerte

FWIW na starej wersji busybox (v1.11.2) Utknąłem, nie ma zegarka, a sen nie obsługuje ułamków. Ale możesz z powodzeniem korzystać ze snu 1.
moodboom

Jest to również świetny sposób na uruchomienie tego w cygwinie
Bradley

34

sleepjuż 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.


18

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"'


Miałem problem z prawidłowym działaniem zegarka na wyrażeniu potokowym, ale po przeczytaniu tego mogłem to naprawić :)
pożerałem elysium

13

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 &


Czy to nie ostatnie i, tak samo jak pisanie polecenia bez & na końcu, ale wywołanie skryptu za pomocą &: bash ./while_check.sh &?
ransh

@ransh: Możemy uruchomić skrypt ./while_check.sh i możemy natychmiast uzyskać identyfikator procesu, gdy dodamy skrypt & in i po prostu uruchomimy skrypt bez &, nie otrzymaliśmy żadnego identyfikatora procesu, ale będzie on działał tło, jak edytowałem, potrzebujemy polecenia ps, aby uzyskać identyfikator procesu, jeśli musimy zatrzymać skrypt.
Ranjithkumar T

Jeśli chcesz, możesz zmodyfikować skrypt echo $!po każdym uruchomieniu procesu w tle - jest to PID ostatniego procesu potomnego uruchomionego w tle.
Jonathan Leffler

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.
tripleee

7

zegarek jest dobry, ale wyczyści ekran.

watch -n 1 'ps aux | grep php'

6

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.


Dzięki .. ale mam 2 pytania, 1 - gdzie zapisać ten kod? innymi słowy, w której ścieżce powinienem umieścić plik zawierający ten skrypt? dzięki czemu działa automatycznie ?! 2 - jak dołączyć plik php do (polecenie # do) zamiast wpisywać tam cały mój kod?
Hossam

1
Sugeruję, abyś przestudiował trochę skryptów bash, abyś mógł zrozumieć podstawy ich uruchamiania i tak dalej.
mote

4

Jeśli chcesz zrobić coś określoną liczbę razy, zawsze możesz to zrobić:

repeat 300 do my first command here && sleep 1.5

8
dla bash wykonaj for x in {1..300} ; do polecenia ||break;sleep 1.5; done
Jasen

4

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.


2

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.


1
watch -n 5 'ls -l 

Uruchamia ls -lpolecenie po każdych 5 sekundach

Wynik :-

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

1

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.