Befehl unter Linux automatisch wiederholen

303

Ist es in der Linux-Befehlszeile möglich, einen Befehl alle n Sekunden wiederholen zu lassen ?

Angenommen, ich habe einen Import ausgeführt, und das tue ich

ls -l

um zu überprüfen, ob die Dateigröße zunimmt. Ich hätte gerne einen Befehl, um diese automatisch wiederholen zu lassen.

Marty Wallace
quelle

Antworten:

541

Alle 5 Sekunden ansehen ...

watch -n 5 ls -l

Wenn Sie eine visuelle Bestätigung der Änderungen wünschen, fügen Sie diese --differencesvor dem lsBefehl hinzu.

Laut der OSX-Manpage gibt es auch

Die Option --cumulative macht das Hervorheben "klebrig" und zeigt eine laufende Anzeige aller Positionen an, die sich jemals geändert haben. Mit der Option -t oder --no-title wird die Kopfzeile deaktiviert, in der das Intervall, der Befehl und die aktuelle Uhrzeit oben in der Anzeige sowie die folgende leere Zeile angezeigt werden.

Die Linux / Unix-Manpage finden Sie hier

Rawkode
quelle
4
Schön - schade, dass keine Ergebnisse an die Kommandozeile angehängt werden
Marty Wallace
1
Antwortoption
3
Beachten Sie, dass Sie Sonderzeichen, die Teil des Befehls sind, den Sie beobachten, watch mysql dbname -e \"show processlist\;\"
umgehen müssen
11
brew install watch
Josh Unger
1
Uhr ist nicht auf Mac OS X 10.10 installiert
João Nunes
118
while true; do
    sleep 5
    ls -l
done
Oleksandr Kravchuk
quelle
10
watchhat auch den unglücklichen Nebeneffekt, den Bildschirm zu löschen, so dass manchmal die Schleife nützlich ist. Welche zu verwenden ist, hängt vom gewünschten Format der Ausgabe ab.
William Pursell
Normalerweise mache ich die Schleife, aber mache sie in einer Zeile. Die Uhr sieht viel besser aus, aber ich muss darauf umsteigen.
Don Branson
1
@MartyWallace Dies kann über die Befehlszeile (die while-Schleife) erfolgen.
Keyser
Es ist erwähnenswert, dass Sie --differencessie hervorheben können (wenn Sie über die Neulackierung des Terminals besorgt sind)
Rawkode
Das ist besser als watch. Watch funktioniert beispielsweise nicht, wenn Sie in jedem Aufruf eine Zufallszahl generieren möchten, z watch -n 1 echo ${RANDOM}. Der Zufall wird nur einmal aufgerufen.
Marcin
92

"watch" erlaubt keine Sekundenbruchteile in Busybox, während "sleep" dies tut. Wenn Ihnen das wichtig ist, versuchen Sie Folgendes:

while true; do ls -l; sleep .5; done
mikhail
quelle
1
Dies ist nützlich, wenn Sie die Ausgabe irgendwo weiterleiten müssen (z. B. nicht rekursiv)
Stephen Smith
1
Vielen Dank. Dies funktioniert für Busybox-Konsolen, die nicht über den Befehl watch verfügen. Ich habe es verwendet, um die Betriebszeit meines Systems zu messen: während wahr; Betriebszeit machen; Schlaf 1; fertig
Santiago Villafuerte
FWIW auf der alten Version von Busybox (v1.11.2) Ich bin festgefahren, es gibt keine Uhr und der Schlaf unterstützt keine Brüche. Sie können sleep 1 jedoch erfolgreich verwenden.
Moodboom
Dies ist auch eine großartige Möglichkeit, dies in Cygwin auszuführen
Bradley
34

sleepkehrt bereits zurück 0. Als solches benutze ich:

while sleep 3 ; do ls -l ; done

Dies ist ein kleines bisschen kürzer als die Lösung von mikhail. Ein kleiner Nachteil ist, dass es schlafen geht, bevor der Zielbefehl zum ersten Mal ausgeführt wird.

Sebastian Wagner
quelle
18

Wenn der Befehl Sonderzeichen wie Pipes und Anführungszeichen enthält, muss der Befehl mit Anführungszeichen aufgefüllt werden. Um dies zu wiederholen ls -l | grep "txt", sollte der Befehl watch beispielsweise wie folgt lauten:

watch -n 5 'ls -l | grep "txt"'

Jonathanzh
quelle
Ich hatte Probleme, die Uhr dazu zu bringen, richtig an einem Ausdruck mit
Pfeifen
13

Das regelmäßige Ausführen von Befehlen ohne Cron ist möglich, wenn wir mit gehen while.

Als Befehl:

while true ; do command ; sleep 100 ; done &
[ ex: # while true;  do echo `date` ; sleep 2 ; done & ]

Beispiel:

while true
do echo "Hello World"
sleep 100
done &

Vergessen Sie nicht das letzte, &da es Ihre Schleife in den Hintergrund stellt. Aber Sie müssen die Prozess-ID mit dem Befehl "ps -ef | grep your_script" finden, dann müssen Sie sie beenden. Fügen Sie daher bitte das '&' hinzu, wenn Sie das Skript ausführen.

# ./while_check.sh &

Hier ist die gleiche Schleife wie bei einem Skript. Erstellen Sie die Datei "while_check.sh" und fügen Sie diese ein:

#!/bin/bash
while true; do 
    echo "Hello World" # Substitute this line for whatever command you want.
    sleep 100
done

Führen Sie es dann durch Eingabe aus bash ./while_check.sh &

Ranjithkumar T.
quelle
Ist das letzte & nicht dasselbe wie das Schreiben des Befehls ohne & am Ende, sondern das Aufrufen des Skripts mit &: bash ./while_check.sh &?
Ransh
@ransh: Wir können das Skript ./while_check.sh & ausführen, sodass wir die Prozess-ID sofort abrufen können. Wenn wir das & in-Skript hinzufügen und das Skript einfach ohne & ausführen, haben wir keine Prozess-ID erhalten, aber es wird ausgeführt Hintergrund, während ich bearbeitet habe, benötigen wir den Befehl ps, um die Prozess-ID zu erhalten, wenn wir das Skript stoppen müssen.
Ranjithkumar T
Wenn Sie möchten, können Sie das Skript echo $!nach jedem Start des Hintergrundprozesses ändern. Dies ist die PID des letzten im Hintergrund gestarteten untergeordneten Prozesses.
Jonathan Leffler
echo `date` ist nur eine schlechte und leicht fehlerhafte Art, einfach zu schreiben date. (Der Fehler hat mit dem fehlenden Zitieren des Arguments zu tun echo.) Siehe auch nutzlose Verwendung von echo.
Tripleee
7

Uhr ist gut, aber wird den Bildschirm reinigen.

watch -n 1 'ps aux | grep php'
Eduardo
quelle
6

Wenn Sie ein "Driften" vermeiden möchten, dh den Befehl alle N Sekunden ausführen möchten, unabhängig davon, wie lange der Befehl dauert (vorausgesetzt, er dauert weniger als N Sekunden), finden Sie hier eine Bash, die einen Befehl alle 5 Sekunden mit eins wiederholt. zweite Genauigkeit (und druckt eine Warnung aus, wenn sie nicht mithalten kann):

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

Es kann immer noch ein wenig driften, da der Schlaf nur auf eine Sekunde genau ist. Sie können diese Genauigkeit verbessern, indem Sie den Befehl date kreativ verwenden.

mcote
quelle
Danke .. aber ich habe 2 Fragen, 1- wo soll ich diesen Code speichern? Mit anderen Worten: In welchen Pfad soll ich die Datei mit diesem Skript einfügen? das macht es automatisch laufen?! 2- Wie füge ich eine PHP-Datei in (# do Befehl) ein, anstatt meinen gesamten Code dort einzugeben?
Hossam
1
Ich schlage vor, dass Sie ein wenig über Bash-Skripte recherchieren, damit Sie die Grundlagen ihrer Ausführung verstehen und so weiter.
Mcote
4

Wenn Sie eine bestimmte Anzahl von Malen ausführen möchten, können Sie dies immer tun:

repeat 300 do my first command here && sleep 1.5
Brightball
quelle
8
für Bash Do for x in {1..300} ; do Befehle ||break;sleep 1.5; done
Jasen
4

Sie können Folgendes ausführen und nur die Größe filtern. Wenn Ihre Datei aufgerufen wurde somefilename, können Sie Folgendes tun

while :; do ls -lh | awk '/some*/{print $5}'; sleep 5; done

Eine der vielen Ideen.

Valentin Bajrami
quelle
2

Verwenden Sie:

while :; do sleep 1m & some-command; wait; done

Aufgrund der Zeit, die bash benötigt, um die Schleifenstruktur auszuführen, und des Schlafbefehls, der tatsächlich ausgeführt werden soll, wird es immer noch eine geringfügige Abweichung geben.

Hinweis: ':' wertet auf 0, dh wahr.

Mathematik
quelle
1
watch -n 5 'ls -l 

Führt den ls -lBefehl alle 5 Sekunden aus

Ausgabe :-

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
HeadAndTail
quelle
1

Eine übersichtliche Lösung, die besonders nützlich ist, wenn Sie den Befehl wiederholt ausführen möchten, bis er fehlschlägt, und mit der Sie alle Ausgaben anzeigen können.

while ls -l; do
    sleep 5
done
Arsdragonfly
quelle