editar - Repita el comando automáticamente en Linux
linux easytag (12)
"watch" no permite fracciones de segundo en Busybox, mientras que "sleep" sí lo hace. Si eso te importa, prueba esto:
while true; do ls -l; sleep .5; done
¿Es posible que en la línea de comandos de Linux se repita un comando cada n segundos?
Por ejemplo, digamos que tengo una importación en ejecución y estoy haciendo
ls -l
para comprobar el tamaño del archivo está aumentando. Me gustaría tener un comando para que esto se repita automáticamente.
Ejecutar comandos periódicamente sin cron es posible cuando vamos con while
.
Como una orden:
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 lo último &
como pondrá su bucle en el fondo. Pero necesita encontrar el id del proceso con el comando "ps -ef | grep your_script" y luego debe matarlo. Así que por favor agregue el ''&'' cuando ejecute el script.
# ./while_check.sh &
Aquí está el mismo bucle que un script. Crea el archivo "while_check.sh" y ponlo en él:
#!/bin/bash
while true; do
echo "Hello World" # Substitute this line for whatever command you want.
sleep 100
done
Luego ejecútelo escribiendo bash ./while_check.sh &
El reloj es bueno pero limpiará la pantalla.
watch -n 1 ''ps aux | grep php''
Mira cada 5 segundos ...
watch -n 5 ls -l
Si desea tener una confirmación visual de los cambios, agregue --differences
antes del comando ls
.
Según la página de manual de OSX, también hay
La opción --cumulativa hace que el resaltado sea "pegajoso", presentando una visualización en ejecución de todas las posiciones que hayan cambiado. La opción -t o --no-título 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 del manual de Linux / Unix se puede encontrar here
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 desviación debido al tiempo de bash para ejecutar la estructura de bucle y el comando de suspensión para ejecutar realmente.
pista: '':'' evals a 0 es cierto.
Puede ejecutar lo siguiente y filtrar solo el tamaño. Si su archivo fue llamado somefilename
nombre de somefilename
, puede hacer lo siguiente
while :; do ls -lh | awk ''/some*/{print $5}''; sleep 5; done
Una de las muchas ideas.
Si desea evitar el "desvío", lo que significa que desea que el comando se ejecute cada N segundos, independientemente de cuánto demore el comando (suponiendo que tome menos de N segundos), aquí hay algo de bash que repetirá un comando cada 5 segundos con uno. segunda precisión (e imprimirá una advertencia si no puede continuar):
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 desviarse un poco, ya que el sueño solo es preciso en un segundo. Podría mejorar esta precisión mediante el uso creativo del comando date.
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
Si el comando contiene algunos caracteres especiales, como canalizaciones y comillas, el comando debe rellenarse con comillas. Por ejemplo, para repetir ls -l | grep "txt"
ls -l | grep "txt"
, el comando watch debería ser:
watch -n 5 ''ls -l | grep "txt"''
sleep
ya devuelve 0
. Como tal, estoy usando:
while sleep 3 ; do ls -l ; done
Esto es un poquito más corto que la solución de Mikhail. Un pequeño inconveniente es que duerme antes de ejecutar el comando de destino por primera vez.
watch -n 5 ''ls -l
Ejecutará el ls -l
después de cada 5s
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
while true; do
sleep 5
ls -l
done