Come posso eseguire `watch` come lavoro in background?


Risposte:


26

Lo scopo di watchè mostrare i risultati di un comando a schermo intero e aggiornarli continuamente; se stai reindirizzando l'output in un file e in background non c'è davvero alcun motivo per usare watch in primo luogo.

Se vuoi semplicemente eseguire un comando più volte con un ritardo ( watchaspetta due secondi per impostazione predefinita), puoi usare qualcosa del genere:

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

C'è un modo per farlo in modo non bloccante? Ad esempio, se voglio mettere questo e altri comandi in un singolo script bash e farlo continuare a eseguire il codice che segue (mentre lo fai ancora in background)?
Austin,

14

Ecco un modo:

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

Dato che si esegue il background del processo, si può presumere che non sia necessario il display del terminale e che si stia reindirizzando a un file. Se lo fai, sarai in grado di eseguire lo sfondo watchsenza problemi.

sleep, come suggerito da Michael Mrozek, rallenterà lentamente, il che può essere indesiderabile. A parte uno script shell contorto che controlla il tempo di sistema ed esegue un comando basato sul tempo trascorso, watch -ppuò essere una buona opzione per tempi precisi.

Per tempi precisi:

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

scusa, come funziona? perché è possibile utilizzare solo &due volte?
phil294

Leggi la sezione della pipeline di man bashper vedere come funziona la prima &. ;)
Mioriin,

11

Non sono sicuro delle tue motivazioni, ma forse questo sarebbe abbastanza?

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

Altrimenti, spiega perché ne hai davvero bisogno watch.


2

teeÈ tuo amico. Ad esempio, ecco come è possibile mostrare il numero di file nella directory corrente e aggiungerlo a count.txt ogni 2 secondi:

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

2

Dipende dalle tue motivazioni:

  • Vuoi eseguire periodicamente qualcosa. Quindi puoi usare direttamente cron. (Se una granularità temporale di 1 minuto è sufficiente per i tuoi scopi).

    • Nota: se l'intervallo è molto breve o il dispositivo è molto limitato e, a meno che non si configuri syslog per registrare meno messaggi da crond, riempirà il syslog abbastanza rapidamente.
  • Vuoi eseguire qualcosa ripetutamente:

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

    (È possibile eseguire questo dal crontab per esempio, anche se è fortemente raccomandato l'uso di uno script).

  • Volete eseguire periodicamente un comando e avere accesso all'output della sua ultima esecuzione.

    • Puoi scrivere l'output su un ramfs (modificando prima lo script):

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

      o anche meglio:

      while sleep 2 ; do
        cmd >& last_execution.log.tmp 
        mv last_execution.log.tmp last_execution.log ## atomically
      done 
    • È possibile combinare screene watch, in modo da poter sempre controllare lo stato più recente, purché si adatti a una schermata:

      screen watch -n 3660 ./make-backup.sh


0

Se devi usare watch- Basta unire le risposte di Mike Deloelo e L0B0

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

per esempio

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

poi guarda i secondi che passano

tail -f output.txt

0

Watch è progettato per l'output sullo schermo, ma il suo output può essere reindirizzato (sia stdout che stderr), quindi verrà eseguito in background.

watch 'date >>fa' >/dev/null 2>/dev/null &
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.