Respuestas:
Puede usar el watch
comando, watch se usa para ejecutar cualquier comando designado a intervalos regulares.
Abra la Terminal y escriba:
watch -n x <your command>
cambie x para que sea el tiempo en segundos que desee.
Para obtener más ayuda con el watch
comando y sus opciones, ejecute man watch
o visite este enlace .
Por ejemplo: lo siguiente enumerará, cada 60s , en la misma Terminal, el contenido del directorio del Escritorio para que pueda saber si se produjo algún cambio:
watch -n 60 ls -l ~/Desktop
watch
con el comando de tipo "historial habilitado"? Me encanta usar watch
, pero a veces prefiero ver un registro de ejecuciones anteriores también, en lugar de solo la última. Y sí, sé que puedo usar scripting ( while true
) para lograr esto, ¡pero usar la watch
utilidad es mucho más limpio!
También puede usar este comando en la terminal, aparte de la respuesta de nux:
while true; do <your_command>; sleep <interval_in_seconds>; done
Ejemplo
while true; do ls; sleep 2; done
Este comando imprimirá la salida ls
en un intervalo de 2 segundos.
Use Ctrl+ Cpara detener el proceso.
Hay algunos inconvenientes de watch
watch
interpretará las secuencias de color ANSI que pasan caracteres de escape utilizando -c
u --color
opción. Por ejemplo, la salida de pygmentize
funcionará pero fallará ls --color=auto
.En las circunstancias anteriores, esto puede aparecer como una mejor opción.
watch
existe para eso, esto es un poco inútil, diría yo
watch
Es bueno en la mayoría de los casos. Es por eso que mencioné "aparte de la respuesta de nux" al principio. Pero hay algunos problemas con, watch
por ejemplo, uno no puede usar ningún comando con aliaswatch
. Tomemos, por ejemplo, un ll
alias ls -laF
pero que no se puede usar con watch
. Además, en caso de que la salida de cualquier comando sea bastante larga, tendrá problemas para desplazarse usando watch
. En estos pocos casos especiales, esta respuesta puede parecer una mejor opción.
watch
al menos permite las opciones -c
u --color
para salida coloreada.
while sleep x
es mejor, es más fácil de matar.
watch
, mantiene el historial de comandos.
Solo quería participar en las respuestas de souravc y nux :
watch
funcionará perfectamente en Ubuntu, es posible que desee evitar eso si desea que su "Unix-fu" sea puro, por ejemplo, en FreeBSD, watch es un comando para "espiar en otra línea tty".while true; do command; sleep SECONDS; done
También tiene una advertencia - el comando podría ser más difícil de matar usando CTR + C . Es posible que desee preferir while sleep SECONDS; do command; done
: no solo es más corto, sino también más fácil de interrumpir. La advertencia es que primero dormirá, luego ejecutará su comando, por lo que deberá esperar un poco SECONDS
antes de que ocurra el primer comando.sleep
en el while
bucle? No pude encontrar ninguna diferencia, Ctrl + C rompió el ciclo instantáneamente sin importar qué.
command
y sleep
y solo se rompería si matas true
.
Suena como la tarea ideal para el cron
demonio que permite ejecutar comandos periódicos. Ejecute el crontab -e
comando para comenzar a editar la configuración cron de su usuario. Su formato está documentado en crontab (5) . Básicamente tiene cinco campos separados por espacios y relacionados con el tiempo seguidos de un comando:
The time and date fields are:
field allowed values
----- --------------
minute 0-59
hour 0-23
day of month 1-31
month 1-12 (or names, see below)
day of week 0-7 (0 or 7 is Sunday, or use names)
Por ejemplo, si desea ejecutar un script de Python todos los martes a las 11 AM:
0 11 * * 1 python ~/yourscript.py
También hay algunos nombres especiales que reemplazan el tiempo, como @reboot
. Muy útil si necesita crear un directorio temporal. Desde mi crontab (listado con crontab -l
):
# Creates a temporary directory for ~/.distcc at boot
@reboot ln -sfn "$(mktemp -d "/tmp/distcc.XXXXXXXX")" "$HOME/.distcc"
cron
corre detrás de las escenas en lugar de en la terminal
Si está monitoreando el sistema de archivos, entonces inotifywait
es brillante y ciertamente agrega menos carga en su sistema.
Ejemplo:
En el primer terminal, escriba este comando:
$ inotifywait .
Luego, en la segunda terminal, cualquier comando que afecte el directorio actual,
$ touch newfile
Luego, en la terminal original, Inotifywait se despertará e informará el evento
./ CREATE newfile2
O en un bucle
$ while true ; do inotifywait . ; done
Setting up watches.
Watches established.
./ OPEN newfile2
Setting up watches.
Watches established.
./ OPEN newfile2
Setting up watches.
Watches established.
./ DELETE newfile
Setting up watches.
Watches established.
./ CREATE,ISDIR newdir
Setting up watches.
Watches established.
grep something InALogFile|less
es un script?
.
no puedo dejar de lado el comando.
-m
para monitorear continuamente sin un bucle.
Puede crear su propio repeat
comando siguiendo los siguientes pasos; créditos aquí :
Primero, abra su .bash_aliases
archivo:
$ xdg-open ~/.bash-aliases
En segundo lugar, pegue estas líneas en la parte inferior del archivo y guarde:
repeat() {
n=$1
shift
while [ $(( n -= 1 )) -ge 0 ]
do
"$@"
done
}
Tercero, cierre y abra nuevamente su terminal o escriba:
$ source ~/.bash_aliases
Et voilà! Ahora puede usarlo así:
$ repeat 5 echo Hello World !!!
o
$ repeat 5 ./myscript.sh
puedes usar crontab. ejecute el comando crontab -e
y ábralo con su editor de texto preferido, luego agregue esta línea
*/10 * * * * /path-to-your-command
Esto ejecutará tu comando cada 10 minutos
* */4 * * * /path-to-your-command
Esto ejecutará su comando cada 4 horas.
$ ..some command...; for i in $(seq X); do $cmd; sleep Y; done
X número de veces para repetir.
Y tiempo de esperar para repetir.
Ejemplo:
$ echo; for i in $(seq 5); do $cmd "This is echo number: $i"; sleep 1;done
Otra preocupación con el enfoque de "observación" propuesto anteriormente es que muestra el resultado solo cuando se realiza el proceso. "date; sleep 58; date" mostrará las 2 fechas solo después de 59 segundos ... Si comienza a ejecutar algo durante 4 minutos, que muestra lentamente varias páginas de contenido, realmente no lo verá.
Por otro lado, la preocupación con el enfoque "while" es que no toma en cuenta la duración de la tarea.
while true; do script_that_take_between_10s_to_50s.sh; sleep 50; done
Con esto, el script se ejecutará en algún momento cada minuto, en algún momento puede tomar 1m40. Entonces, incluso si un cron podrá ejecutarlo cada minuto, aquí no lo hará.
Entonces, para ver la salida en el shell a medida que se genera y esperar el tiempo de solicitud exacto, debe mirar el tiempo antes y después, y recorrer el tiempo.
Algo como:
while ( true ); do
echo Date starting `date`
before=`date +%s`
sleep `echo $(( ( RANDOM % 30 ) + 1 ))`
echo Before waiting `date`
after=`date +%s`
DELAY=`echo "60-($after-$before)" | bc`
sleep $DELAY
echo Done waiting `date`
done
Esto generará esto:
Como puede ver, el comando se ejecuta cada minuto:
Date starting Mon Dec 14 15:49:34 EST 2015
Before waiting Mon Dec 14 15:49:52 EST 2015
Done waiting Mon Dec 14 15:50:34 EST 2015
Date starting Mon Dec 14 15:50:34 EST 2015
Before waiting Mon Dec 14 15:50:39 EST 2015
Done waiting Mon Dec 14 15:51:34 EST 2015
Así que simplemente reemplace el echo $(( ( RANDOM % 30 ) + 1 ))
comando "dormir " con lo que quiera y se ejecutará, en el terminal / shell, exactamente cada minuto. Si desea otro horario, simplemente cambie los "60" segundos con lo que necesite.
Versión más corta sin las líneas de depuración:
while ( true ); do
before=`date +%s`
sleep `echo $(( ( RANDOM % 30 ) + 1 ))` # Place you command here
after=`date +%s`
DELAY=`echo "60-($after-$before)" | bc`
sleep $DELAY
done
watch -n 1 'echo $COLUMNS'
ywatch -n 1 echo $COLUMNS
al cambiar el tamaño de su terminal: el primero se expande cada segundo, pero el segundo se expande solo una vez antes dewatch
comenzar.