Ripeti il ​​comando automaticamente su Linux


303

È possibile nella riga di comando di Linux ripetere un comando ogni n secondi?

Di ', ho un'importazione in esecuzione e lo sto facendo

ls -l

per verificare se la dimensione del file è in aumento. Vorrei avere un comando per ripetere automaticamente questa ripetizione.

Risposte:


541

Guarda ogni 5 secondi ...

watch -n 5 ls -l

Se si desidera avere una conferma visiva delle modifiche, aggiungere --differencesprima del lscomando.

Secondo la pagina man di OSX, c'è anche

L'opzione --cumulative rende l'evidenziazione "appiccicosa", presentando una visualizzazione corrente di tutte le posizioni che sono mai cambiate. L'opzione -t o --no-title disattiva l'intestazione che mostra l'intervallo, il comando e l'ora corrente nella parte superiore del display, nonché la seguente riga vuota.

La pagina man di Linux / Unix può essere trovata qui


4
Bello - penoso per non aver aggiunto i risultati alla riga di comando
Marty Wallace il

1
Aggiunta opzione per rispondere che consente di evidenziare le modifiche
Rawkode

3
Si noti che è necessario sfuggire ai caratteri speciali che fanno parte del comando che si sta guardando, ad esempio: watch mysql dbname -e \"show processlist\;\"
pfrenssen,

11
brew install watch
Josh Unger,

1
l'orologio non è installato su mac os X 10.10
João Nunes

118
while true; do
    sleep 5
    ls -l
done

10
watchha anche lo sfortunato effetto collaterale di cancellare lo schermo, quindi a volte il ciclo è utile. Quale usare dipende dal formato desiderato dell'output.
William Pursell,

Di solito faccio il ciclo, ma lo faccio su una riga. Guarda sembra molto meglio, però, dovrò passare a quello.
Don Branson,

1
@MartyWallace Questo può essere fatto con la riga di comando (il ciclo while).
keyser il

Vale la pena notare che puoi usarli --differencesper evidenziarli (se sei preoccupato per la riverniciatura del terminale)
Rawkode,

Questo è meglio di watch. L'orologio non funziona ad esempio quando si desidera generare un numero casuale in ciascuna chiamata, ad es watch -n 1 echo ${RANDOM}. Il casuale verrà chiamato solo una volta.
Marcin,

92

"watch" non consente le frazioni di secondo in Busybox, mentre "sleep" lo fa. Se questo è importante per te, prova questo:

while true; do ls -l; sleep .5; done

1
Ciò è utile se è necessario reindirizzare l'output da qualche parte (come la barra non è ricorsiva)
Stephen Smith

1
Grazie. Funziona con le console busybox che non hanno il comando watch. L'ho usato per misurare il tempo di attività del mio sistema: mentre vero; fare uptime; dormire 1; fatto
Santiago Villafuerte,

FWIW sulla vecchia versione di busybox (v1.11.2) con cui sono bloccato, non c'è orologio e il sonno non supporta le frazioni. Ma puoi usare il sonno 1 con successo.
moodboom,

Questo è anche un ottimo modo per eseguirlo in Cygwin
Bradley,

34

sleepritorna già 0. Come tale, sto usando:

while sleep 3 ; do ls -l ; done

Questo è un po 'più corto della soluzione di Mikhail. Un piccolo inconveniente è che dorme prima di eseguire il comando target per la prima volta.


18

Se il comando contiene alcuni caratteri speciali come pipe e virgolette, il comando deve essere riempito con virgolette. Ad esempio, per ripetere ls -l | grep "txt", il comando watch dovrebbe essere:

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


Avevo problemi a far funzionare correttamente l'orologio su un'espressione convogliata, ma dopo aver letto questo ho potuto risolverlo :)
divorato elisium

13

È possibile eseguire comandi periodicamente senza cron quando andiamo con while .

Come comando:

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

Esempio:

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

Non dimenticare l'ultimo &in quanto metterà il tuo loop in background. Ma devi trovare l'id del processo con il comando "ps -ef | grep your_script", quindi devi ucciderlo. Quindi gentilmente aggiungere il '&' quando si esegue lo script.

# ./while_check.sh &

Ecco lo stesso loop di uno script. Crea il file "while_check.sh" e inseriscilo:

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

Quindi eseguilo digitando bash ./while_check.sh &


Non è l'ultimo &, uguale a scrivere il comando senza & alla fine, ma chiamare lo script con &: bash ./while_check.sh &?
ransh,

@ransh: possiamo eseguire lo script ./while_check.sh e così possiamo ottenere immediatamente l'ID del processo, quando aggiungiamo lo script & in ed eseguiamo semplicemente lo script senza &, non abbiamo ottenuto alcun ID di processo ma verrà eseguito sfondo, come ho modificato, abbiamo bisogno del comando ps per ottenere l'id del processo se dobbiamo interrompere lo script.
Ranjithkumar T,

Se lo desideri, puoi modificare lo script echo $!dopo che ogni processo in background è stato avviato: questo è il PID dell'ultimo processo figlio avviato in background.
Jonathan Leffler,

echo `date` è solo un modo scarso e leggermente buggy di scrivere solo date. (Il bug ha a che fare con la mancanza della citazione dell'argomento echo.) Vedi anche l' uso inutile di echo.
triplo il

7

l'orologio è buono ma pulirà lo schermo.

watch -n 1 'ps aux | grep php'

6

Se vuoi evitare il "drifting", nel senso che vuoi che il comando venga eseguito ogni N secondi indipendentemente da quanto tempo impiega il comando (supponendo che impiega meno di N secondi), ecco alcuni bash che ripeteranno un comando ogni 5 secondi con uno- seconda precisione (e stamperà un avviso se non riesce a tenere il passo):

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

Potrebbe ancora spostarsi leggermente poiché il sonno è preciso solo per un secondo. È possibile migliorare questa precisione utilizzando in modo creativo il comando data.


Grazie .. ma ho 2 domande, 1- dove salvare quel codice? in altre parole, in quale percorso devo inserire il file contenente quello script? che lo fa funzionare automaticamente ?! 2- come includere il file php in (comando # do) invece di digitare lì tutto il mio codice?
Hossam,

1
Ti suggerisco di fare qualche ricerca sugli script bash in modo da poter capire le basi di come eseguirli e così via.
mcote il

4

Se vuoi fare qualcosa un numero specifico di volte puoi sempre farlo:

repeat 300 do my first command here && sleep 1.5

8
per bash do i for x in {1..300} ; do comandi ||break;sleep 1.5; done
Jasen,

4

È possibile eseguire quanto segue e filtrare solo le dimensioni. Se il tuo file è stato chiamato somefilenamepuoi fare quanto segue

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

Una delle tante idee.


2

Per ridurre al minimo la deriva più facilmente, utilizzare:

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

ci sarà ancora una piccola quantità di deriva a causa del tempo di bash per eseguire la struttura del loop e il comando sleep per eseguire effettivamente.

suggerimento: ':' passa a 0 cioè vero.


1
watch -n 5 'ls -l 

Correràls -l comando ogni 5 secondi

Produzione :-

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

Una soluzione concisa, particolarmente utile se si desidera eseguire il comando ripetutamente fino a quando non ha esito negativo e consente di visualizzare tutto l'output.

while ls -l; do
    sleep 5
done
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.