Repita el comando automáticamente en Linux

303

¿Es posible que en la línea de comandos de Linux se repita un comando cada n segundos?

Digamos, tengo una importación en ejecución, y estoy haciendo

ls -l

para verificar si el tamaño del archivo está aumentando. Me gustaría tener un comando para que esto se repita automáticamente.

Marty Wallace
fuente

Respuestas:

541

Mire cada 5 segundos ...

watch -n 5 ls -l

Si desea tener una confirmación visual de los cambios, agregue --differencesantes del lscomando.

Según la página del manual de OSX, también hay

La opción --cumulativa hace que el resaltado sea "pegajoso", presentando una visualización continua de todas las posiciones que alguna vez han cambiado. La opción -t o --no-title desactiva el encabezado que muestra el intervalo, el comando y la hora actual en la parte superior de la pantalla, así como la siguiente línea en blanco.

La página de manual de Linux / Unix se puede encontrar aquí

Rawkode
fuente
44
Agradable - lástima que no agregue resultados a la línea de comando
Marty Wallace
1
Opción agregada para responder que permite resaltar los cambios
Rawkode
3
Tenga en cuenta que necesita escapar de caracteres especiales que forman parte del comando que está viendo, por ejemplo: watch mysql dbname -e \"show processlist\;\"
pfrenssen
11
brew install watch
Josh Unger
1
watch no está instalado en mac os X 10.10
João Nunes
118
while true; do
    sleep 5
    ls -l
done
Oleksandr Kravchuk
fuente
10
watchTambién tiene el desafortunado efecto secundario de limpiar la pantalla, por lo que a veces el bucle es útil. Cuál usar depende del formato deseado de la salida.
William Pursell
Por lo general, hago el ciclo, pero lo hago en una línea. Watch se ve mucho mejor, sin embargo, tendré que cambiar a eso.
Don Branson el
1
@MartyWallace Esto se puede hacer con la línea de comando (el bucle while).
keyser
Vale la pena señalar que puede usar --differencespara resaltarlos (si está preocupado por el repintado de la terminal)
Rawkode
Esto es mejor que watch. Watch no funciona, por ejemplo, cuando desea generar un número aleatorio en cada invocación, por ejemplo watch -n 1 echo ${RANDOM}. El azar solo será llamado una vez.
Marcin
92

"mirar" no permite fracciones de segundo en Busybox, mientras que "dormir" sí. Si eso te importa, prueba esto:

while true; do ls -l; sleep .5; done
mikhail
fuente
1
Esto es útil si necesita canalizar la salida en algún lugar (como la barra no es recursiva)
Stephen Smith
1
Gracias. Esto funciona para las consolas busybox que no tienen el comando watch. Lo usé para medir el tiempo de actividad de mi sistema: si bien es cierto; hacer tiempo de actividad; dormir 1; hecho
Santiago Villafuerte
FWIW en la versión anterior de busybox (v1.11.2) Estoy atrapado, no hay reloj y el sueño no admite fracciones. Pero puedes usar sleep 1 con éxito.
moodboom
Esta también es una excelente manera de ejecutar esto en Cygwin
Bradley
34

sleepYa vuelve 0. Como tal, estoy usando:

while sleep 3 ; do ls -l ; done

Esto es un poco más corto que la solución de mikhail. Un inconveniente menor es que duerme antes de ejecutar el comando de destino por primera vez.

Sebastian Wagner
fuente
18

Si el comando contiene algunos caracteres especiales, como tuberías y comillas, el comando debe rellenarse con comillas. Por ejemplo, para repetir ls -l | grep "txt", el comando watch debería ser:

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

jonathanzh
fuente
Estaba teniendo problemas para conseguir el reloj funcione correctamente en una expresión corriente, pero después de leer esto pude solucionarlo :)
Elysium devorado
13

Es posible ejecutar comandos periódicamente sin cron cuando vamos con while.

Como un comando:

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

Ejemplo:

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

No olvide el último, &ya que pondrá su bucle en segundo plano. Pero necesita encontrar la identificación del proceso con el comando "ps -ef | grep your_script" y luego debe eliminarlo. Añada amablemente el '&' cuando ejecute el script.

# ./while_check.sh &

Aquí está el mismo bucle que un script. Crea el archivo "while_check.sh" y ponlo aquí:

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

Luego ejecútalo escribiendo bash ./while_check.sh &

Ranjithkumar T
fuente
¿No es el último &, igual que escribir el comando sin & al final, pero llamar al script con &: bash ./while_check.sh &?
ransh
@ransh: Podemos ejecutar el script ./while_check.sh & para que podamos obtener la identificación del proceso de inmediato, cuando agregamos el script & in y simplemente ejecutamos el script sin &, no obtuvimos ninguna identificación del proceso pero se ejecutará En segundo plano, como edité, necesitamos el comando ps para obtener la identificación del proceso si necesitamos detener el script.
Ranjithkumar T
Si lo desea, puede modificar el script echo $!después de que se inicie cada proceso en segundo plano: ese es el PID del último proceso secundario iniciado en segundo plano.
Jonathan Leffler
echo `date` es una manera pobre y un poco defectuosa de escribir solo date. (El error tiene que ver con la falta de cita del argumento para echo). Ver también uso inútil de echo.
tripleee
7

El reloj es bueno pero limpiará la pantalla.

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

Si desea evitar la "deriva", lo que significa que desea que el comando se ejecute cada N segundos, independientemente de cuánto tiempo tome el comando (suponiendo que tome menos de N segundos), aquí hay un golpe que repetirá un comando cada 5 segundos con uno- segunda precisión (e imprimirá una advertencia si no puede seguir el ritmo):

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

Todavía puede moverse un poco, ya que el sueño solo es preciso hasta un segundo. Puede mejorar esta precisión mediante el uso creativo del comando de fecha.

mcote
fuente
Gracias ... pero tengo 2 preguntas, 1- ¿dónde guardar ese código? en otras palabras, ¿en qué ruta debo colocar el archivo que contiene ese script? eso hace que se ejecute automáticamente? 2- ¿cómo incluir el archivo php en (# do command) en lugar de escribir todo mi código allí?
Hossam
1
Le sugiero que investigue un poco sobre los scripts de bash para que pueda comprender los conceptos básicos de cómo ejecutarlos, etc.
mcote
4

Si desea hacer algo un número específico de veces, siempre puede hacer esto:

repeat 300 do my first command here && sleep 1.5
bola brillante
fuente
8
para los for x in {1..300} ; do comandos bash do||break;sleep 1.5; done
Jasen
4

Puede ejecutar lo siguiente y filtrar solo el tamaño. Si se llamó a su archivo somefilename, puede hacer lo siguiente

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

Una de las muchas ideas.

Valentin Bajrami
fuente
2

Para minimizar la deriva más fácilmente, use:

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

todavía habrá una pequeña cantidad de deriva debido al tiempo de bash para ejecutar la estructura de bucle y el comando de suspensión para ejecutar realmente.

sugerencia: ':' evalúa a 0, es decir, verdadero.

matemáticas
fuente
1
watch -n 5 'ls -l 

Ejecutará el ls -lcomando cada 5 s

Salida: -

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
Cabeza y cola
fuente
1

Una solución concisa, que es particularmente útil si desea ejecutar el comando repetidamente hasta que falle, y le permite ver todos los resultados.

while ls -l; do
    sleep 5
done
arsdragonfly
fuente