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.