Como posso executar 'watch' como um job em background?

17

Quando eu corro:

watch 'cmd >> output.txt' &

o trabalho é suspenso pelo sistema:

3569 Stopped (tty output)

Existe uma solução alternativa?

    
por Juliusz 03.08.2011 / 20:17

7 respostas

23

O propósito de watch é mostrar os resultados de um comando em tela cheia e atualizar continuamente; Se você está redirecionando a saída para um arquivo e criando um plano de fundo, não há realmente nenhuma razão para usar o relógio em primeiro lugar.

Se você quiser apenas executar um comando repetidamente com um atraso ( watch espera dois segundos por padrão), você pode usar algo como isto:

while true; do
    cmd >> output.txt
    sleep 2
done
    
por 03.08.2011 / 20:42
11

Não tenho certeza sobre suas motivações, mas talvez isso seja suficiente?

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

Caso contrário, explique por que você realmente precisa de watch .

    
por 03.08.2011 / 20:43
10

Aqui está uma maneira:

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

Como você faz o processo em segundo plano, podemos supor que você não precisa da exibição do terminal e está bem redirecionando para um arquivo. Se você fizer isso, poderá fazer o watch sem problemas.

sleep , como sugerido por Michael Mrozek, irá lentamente atrasar o que pode ser indesejável. Além de um script de shell complicado que monitora a hora do sistema e executa um comando com base no tempo decorrido, watch -p pode ser uma boa opção para tempos precisos.

Para horários precisos:

watch -n 1 -p 'date' &>/dev/null &
    
por 19.07.2014 / 11:17
2

tee é seu amigo. Por exemplo, aqui está como você pode mostrar o número de arquivos no diretório atual e anexá-lo ao count.txt a cada 2 segundos:

watch 'find . -maxdepth 1 -printf " " | wc -c | tee --append count.txt'
    
por 27.09.2011 / 13:20
2

Depende das suas motivações:

  • Você quer executar algo periodicamente. Então você poderia usar diretamente cron. (Se uma granularidade de tempo de 1 minuto é suficiente para seus propósitos).
    • Nota: Se o intervalo for muito curto ou o dispositivo for muito restrito e, a menos que você configure o syslog para registrar menos mensagens do crond, ele preencherá seu syslog rapidamente.
  • Você deseja apenas executar algo repetidamente:
    while sleep 2 ; do cmd done >& log.txt (Você pode executar isso a partir do crontab, por exemplo, embora seja altamente recomendável usar um script).

  • Você deseja executar periodicamente um comando e ter acesso à saída de sua última execução.

    • Você pode gravar a saída em um ramfs (modificando o script antes): while sleep 2 ; do cmd >& last_execution.log done ou melhor ainda: %código%
    • Você pode combinar while sleep 2 ; do cmd >& last_execution.log.tmp mv last_execution.log.tmp last_execution.log ## atomically done e screen , para que você possa sempre verificar o status mais recente, desde que ele caiba em uma tela cheia. %código%
por 30.05.2017 / 17:27
1

Você pode usar o comando screen.

link

    
por 27.09.2011 / 14:10
0

Se você precisar usar watch - basta combinar respostas de mike dangelo e l0b0

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

por exemplo,

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

depois veja os segundos passarem

tail -f output.txt
    
por 21.07.2018 / 18:22