Como posso executar o `watch` como um trabalho em segundo plano?


Respostas:


26

O objetivo de watché mostrar os resultados de um comando em tela cheia e atualizar continuamente; se você estiver redirecionando a saída para um arquivo e colocando-o em segundo plano, não há realmente nenhuma razão para usar o watch em primeiro lugar.

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

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

Existe uma maneira de fazer isso de uma maneira não-bloqueadora? Por exemplo, se eu quiser colocar esse e outros comandos em um único script bash, e continuar executando o código que vem depois disso (enquanto ainda o faço em segundo plano)?
Austin

14

Aqui está uma maneira:

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

Como você processa o processo em segundo plano, podemos presumir que você não precisa da exibição do terminal e você pode redirecionar para um arquivo. Se você fizer isso, poderá obter um plano de fundo watchsem problemas.

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

Para horários precisos:

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

desculpe, como isso funciona? por que é possível usar apenas &duas vezes?
phil294

Leia a seção de pipeline man bashpara ver como o primeiro &funciona. ;)
Mioriin

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 watch.


2

teeé seu amigo. Por exemplo, veja 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'

2

Depende de suas motivações:

  • Você deseja executar algo periodicamente. Então você pode usar o cron diretamente. (Se uma granularidade de tempo de 1 minuto for suficiente para seus propósitos).

    • Nota: Se o intervalo for muito curto ou o dispositivo estiver muito limitado, e a menos que você configure o syslog para registrar menos mensagens do crond, ele preencherá o seu syslog rapidamente.
  • Você deseja executar algo repetidamente:

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

    (Você pode executar isso no 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:

      while sleep 2 ; do
        cmd >& last_execution.log.tmp 
        mv last_execution.log.tmp last_execution.log ## atomically
      done 
    • Você pode combinar screene watch, para sempre verificar o status mais recente, desde que ele se encaixe em uma única tela:

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


0

Se você deve usar watch- Basta combinar as 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 &

então assista os segundos passarem

tail -f output.txt

0

O Watch foi projetado para gerar saída para a tela, mas sua saída pode ser redirecionada (stdout e stderr) e será executada em segundo plano.

watch 'date >>fa' >/dev/null 2>/dev/null &
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.