¿Cómo puedo ejecutar `watch` como trabajo en segundo plano?

Respuestas:

26

El propósito de watches mostrar los resultados de un comando en pantalla completa y actualizar continuamente; si está redirigiendo la salida a un archivo y está en segundo plano, en realidad no hay razón para usar watch en primer lugar.

Si desea ejecutar un comando una y otra vez con un retraso ( watchespera dos segundos por defecto), puede usar algo como esto:

while true; do
    cmd >> output.txt
    sleep 2
done
Michael Mrozek
fuente
Sin embargo, ¿hay alguna manera de hacer esto sin bloqueo? Por ejemplo, si quiero poner este y otros comandos en un solo script bash, y que continúe ejecutando el código que viene después de esto (mientras sigo haciendo esto en segundo plano)?
Austin
14

Aquí hay una manera:

watch -n 1 'date' &>/dev/null &

Dado que realiza el proceso en segundo plano, podemos suponer que no necesita la pantalla del terminal y que está bien redireccionando a un archivo. Si lo haces, podrás crear un fondo watchsin problemas.

sleep, como lo sugiere Michael Mrozek, se retrasará lentamente, lo que puede ser indeseable. Además de un script de shell complicado que monitorea la hora del sistema y ejecuta un comando basado en el tiempo transcurrido, watch -ppuede ser una buena opción para tiempos precisos.

Para tiempos precisos:

watch -n 1 -p 'date' &>/dev/null &
mike dangelo
fuente
perdon, como funciona esto? ¿Por qué es posible usar solo &dos veces?
phil294
Lea la sección de canalización de man bashpara ver cómo funciona el primero &. ;)
Mioriin
11

No estoy seguro de tus motivaciones, pero ¿tal vez esto sea suficiente?

while true; do sleep 2; cmd >>output.txt; done &

De lo contrario, explique por qué realmente lo necesita watch.

Stéphane Gimenez
fuente
2

teees tu amigo. Por ejemplo, así es como puede mostrar la cantidad de archivos en el directorio actual y agregarlo a count.txt cada 2 segundos:

watch 'find . -maxdepth 1 -printf " " | wc -c | tee --append count.txt'
l0b0
fuente
2

Depende de tus motivaciones:

  • Desea ejecutar algo periódicamente. Entonces podrías usar directamente cron. (Si una granularidad de tiempo de 1 minuto es suficiente para sus propósitos).

    • Nota: Si el intervalo es muy corto o el dispositivo está muy restringido, y a menos que configure syslog para registrar menos mensajes de crond, llenará su syslog con bastante rapidez.
  • Solo quieres ejecutar algo repetidamente:

    while sleep 2 ; do
      cmd
    done >& log.txt

    (Puede ejecutar esto desde el crontab, por ejemplo, aunque se recomienda usar un script).

  • Desea ejecutar periódicamente un comando y tener acceso a la salida de su última ejecución.

    • Puede escribir la salida en un ramfs (modificando el script antes):

      while sleep 2 ; do
        cmd >& last_execution.log
      done 

      o mejor:

      while sleep 2 ; do
        cmd >& last_execution.log.tmp 
        mv last_execution.log.tmp last_execution.log ## atomically
      done 
    • Puede combinar screeny watch, para que siempre pueda verificar el estado más reciente, siempre que quepa en una pantalla:

      screen watch -n 3660 ./make-backup.sh
Raúl Salinas-Monteagudo
fuente
0

Si debe usarlo watch: solo combine las respuestas de mike dangelo y l0b0

watch -n 1 'cmd | tee -a output.txt' &>/dev/null &

p.ej

watch -n 1 'date | tee -a output.txt' &>/dev/null &

luego mira pasar los segundos

tail -f output.txt
SDK
fuente
0

Watch está diseñado para salir a la pantalla, pero su salida se puede redirigir (tanto stdout como stderr) y luego se ejecutará en segundo plano.

watch 'date >>fa' >/dev/null 2>/dev/null &
X Tian
fuente