Linux / Comando watch: repetir consultas e destacar mudanças

watch é um comando que executa repetidamente um comando especificado em intervalos regulares e atualiza toda a tela do terminal com os resultados. O intervalo de execução padrão é de 2 segundos, e você pode alterar o intervalo com -n e destacar as partes que mudaram em relação aos resultados anteriores com -d.

É útil para observar, por pouco tempo, mudanças na memória, no disco, nos processos ou na rede. Para sair, normalmente você usa q ou Ctrl+c.

O que é o comando watch?

watch é um programa incluído no conjunto de ferramentas procps-ng. Ele executa o comando repetidamente e mostra sua saída padrão e sua saída de erro, limitadas ao espaço visível do terminal. Assim, você acompanha o resultado sem digitar o mesmo comando várias vezes.

O cabeçalho apresenta informações da execução, como comando, intervalo ou horário e estado de saída; os campos exatos dependem da versão. Se os resultados da execução forem maiores que a tela, partes podem ficar ocultas, então outras ferramentas podem ser mais adequadas para acompanhar logs longos ou grandes quantidades de saída.

Você pode verificar o comportamento padrão e as opções atuais no manual watch(1) e no código-fonte do manual de watch no procps-ng.

Sintaxe básica e uso

Use um terminal Linux com watch instalado e confirme cada comando isoladamente antes de repeti-lo. Os exemplos usam utilitários GNU/procps-ng; consultas de rede e serviços também exigem as ferramentas correspondentes. Não é necessário executar toda consulta como administrador.

watch [option] command [command arguments...]

No esquema acima, [option] representa opções de watch, command é o programa e o último campo reúne seus argumentos; os colchetes não são digitados. O exemplo seguinte repete free -h a cada 2 segundos, salvo configuração diferente de WATCH_INTERVAL.

watch free -h

Para executar em intervalos de 1 segundo, adicione a opção -n.

watch -n 1 free -h

A tela mantém a tabela de memória e substitui os valores a cada atualização, sem acrescentar novas linhas ao histórico do terminal. Os números dependem da máquina; pressione Ctrl+c para encerrar. Para interpretar available, cache e swap, consulte a explicação do comando free.

As opções de watch devem ser colocadas antes do comando a ser repetido. Opções escritas após o comando geralmente são passadas para o comando repetido, não para watch.

Opções usadas com frequência

Opção Função Uso
-n segundos Especificar o intervalo de execução Define um valor em segundos, como em watch -n 1 comando.
-d Destacar as partes alteradas Destaca os caracteres que foram alterados em comparação com a tela anterior.
-d=permanent Destaque de alterações cumulativas Continua destacando qualquer parte que tenha mudado pelo menos uma vez desde a primeira execução.
-g Sair quando a saída mudar Pode ser usado para esperar até que um arquivo ou status mude.
-e Parar a atualização em caso de erro de comando Se o comando repetido terminar com um status diferente de zero, ele pausa a tela e sai após pressionar uma tecla.
-b Apitar em caso de erro de comando Se o comando repetido retornar um estado diferente de zero, ele emitirá o sinal sonoro do terminal.
-p Tentar intervalos de início exatos Executar de acordo com o intervalo especificado com base no horário de início da execução anterior.
-t Ocultar título superior Libera o espaço do cabeçalho para mostrar os resultados do comando.
-c Interpretar cores ANSI Interpreta sequências de cor e estilo presentes na saída do comando.
-w Evitar quebra de linha em linhas longas Exibe linhas que excedem a largura da tela cortando-as em vez de quebrá-las para a linha seguinte.
-x Executar sem passar pelo shell Executa o programa diretamente, em vez de chamar sh -c; o comando repetido não interpreta sintaxe de shell.

As opções suportadas podem variar dependendo da versão do procps-ng incluída na distribuição. Você pode verificar as opções disponíveis em seu sistema atual com o seguinte comando.

watch --help
watch --version

Como controlar o intervalo e as mudanças de saída

Definir o intervalo com -n

Especifique um valor em segundos após -n ou --interval. Você também pode usar decimais, mas um intervalo muito curto pode gerar carga desnecessária na CPU (unidade central de processamento), no disco, na rede e nos serviços consultados.

watch -n 0.5 date
watch -n 5 df -h

Sem -n, o padrão é 2 segundos, mas a variável de ambiente WATCH_INTERVAL pode definir outro valor. O manual atual limita o intervalo ao mínimo de 0,1 segundo e ao máximo de 31 dias; confirme os limites na versão instalada.

Destacar alterações com -d

-d destaca partes que foram alteradas comparando a tela atual com a anterior. Isso é conveniente ao visualizar estatísticas de memória, processos e rede que mudam rapidamente.

watch -n 1 -d free -h

Para exibir continuamente todos os locais alterados após a primeira tela, use -d=permanent se a versão instalada oferecer suporte.

watch -n 1 -d=permanent free -h

Encerrar quando a saída mudar com -g

-g ou --chgexit encerra watch quando a saída visível na tela muda. Pode ser usado ao aguardar alterações em horários de modificação de arquivos ou status de tarefas de implantação.

Para reproduzir o exemplo, use um arquivo descartável: se /tmp/result.txt ainda não existir, crie-o com touch /tmp/result.txt. Se esse caminho já estiver em uso, escolha outro e ajuste os dois comandos. Inicie a consulta abaixo; em outro terminal, execute sleep 2; touch /tmp/result.txt. O número retornado por stat -c %Y representa o horário de modificação em segundos; ao mudar, a consulta termina. Remova o arquivo depois somente se você o criou para esse teste.

watch -g -n 1 'stat -c %Y /tmp/result.txt'

Se a saída mudar apenas na parte que ficou fora da tela, as alterações podem não ser detectadas. Para automação onde a detecção de mudanças é crítica, é mais seguro usar o status de saída do comando alvo ou ferramentas de monitoramento dedicadas, em vez de comparar a saída da tela.

Por que aspas são necessárias ao usar pipes e sintaxe de shell

Por padrão, watch executa o comando passado através de sh -c. Se você quiser usar pipes, redirecionamento, ponto e vírgula, variáveis e curingas como parte do comando repetido, é mais claro envolver o comando inteiro entre aspas simples.

Comandos simples são passados como estão

Comandos sem pipes ou redirecionamento podem ser escritos diretamente assim.

watch -n 2 ls -lh /var/log

Agrupar pipes e variáveis na mesma expressão

No exemplo a seguir, aspas simples impedem que o shell atual processe o pipe primeiro e passam todo o comando para o shell que o executará repetidamente.

watch -n 1 'ps -eo pid,comm,%cpu,%mem --sort=-%cpu | head -n 15'

Agrupe redirecionamentos ou vários comandos da mesma forma.

watch -n 5 'date; df -h / /var'

A opção -x executa o programa diretamente, sem o shell interno. Pipes, redirecionamentos e expansões não são interpretados a cada repetição. O shell em que você digita a linha ainda pode expandir argumentos antes de iniciar watch; por isso, as aspas continuam relevantes.

watch -x -n 2 ls -lh /var/log

O comportamento geral das aspas está explicado nas regras de aspas do GNU Bash.

Exemplos de consulta do sistema

O que consultar Descrição
Memória Atualiza o resultado free -h a cada segundo e destaca as partes alteradas.
Espaço em disco Verifica o uso dos sistemas de arquivos raiz e /var a cada 5 segundos.
Processos que usam CPU Ordena os resultados ps pelo uso de CPU e mostra as principais entradas.
Resumo de sockets Verifica repetidamente o status geral dos sockets de rede com ss -s.
Tamanho do arquivo Observa mudanças no tamanho de um arquivo com stat.
Estado do serviço Executa systemctl status repetidamente, com --no-pager.

Uso de memória

watch -n 1 -d free -h

Uso de disco

watch -n 5 'df -h / /var'

Confira as colunas de tamanho, usado e disponível de cada sistema de arquivos. Se / e /var estiverem no mesmo sistema de arquivos, podem mostrar os mesmos valores; isso não representa dois discos independentes.

Processos com alto uso de CPU

watch -n 1 'ps -eo pid,comm,%cpu,%mem --sort=-%cpu | head -n 15'

A primeira linha é o cabeçalho; head -n 15 deixa até 14 processos abaixo dele. Segundo o manual de ps, %cpu é uma média desde o início do processo, e não uma amostra instantânea do último segundo. Use top ou htop para acompanhar esse outro tipo de medição.

Resumo de sockets de rede

watch -n 1 ss -s

A saída resume sockets, os pontos de comunicação usados pelas conexões de rede, e contagens por protocolo. Esse comando não captura o conteúdo dos pacotes; confirme que ss, normalmente do conjunto iproute2, está instalado.

Tamanho do arquivo e horário de modificação

Substitua archive.tar pelo caminho de um arquivo existente que deseja observar. O exemplo não cria nem compacta um arquivo.

watch -n 1 'stat -c "%s bytes  %y" archive.tar'

%s mostra o tamanho em bytes e %y o horário de modificação. O tamanho só muda se outro processo modificar o arquivo; consultar um arquivo estático produz a mesma saída a cada repetição.

Estado do serviço

Este exemplo exige systemd e a unidade nginx instalada. Troque o nome pela unidade real e consulte o estado uma vez antes de repetir. Uma unidade inexistente ou inativa pode retornar estado diferente de zero sem indicar falha do próprio watch.

watch -n 2 'systemctl --no-pager --full status nginx'

Comandos que podem gerar saída longa, como status do serviço, podem ser exibidos parcialmente dependendo do tamanho do terminal. Se o objetivo for o acompanhamento contínuo de logs, um comando adequado para essa função, como journalctl -f -u nginx, é mais apropriado.

Intervalos de execução exatos e comandos de longa duração

No comportamento padrão, após a execução de um único comando terminar, ele aguarda o intervalo especificado antes de iniciar a próxima execução. Usar -p ou --precise tenta alinhar o próximo horário de início com base em quando o comando anterior começou.

No exemplo abaixo, https://example.com/health é apenas um endereço ilustrativo, não um endpoint de saúde fornecido pelo domínio. Substitua-o por uma URL real de consulta que você tem autorização para monitorar e teste curl uma vez antes de repetir. Com -f, respostas HTTP de erro resultam em falha do comando.

watch -p -n 10 'date; curl -fsS https://example.com/health'

Se o tempo de execução de um comando repetido for maior que o intervalo especificado, watch não executará várias instâncias simultaneamente, mas aguardará a conclusão do comando atual. Para tarefas programadas que precisam de registro de execução e controle de falhas, prefira um timer do systemd ou um agendador de tarefas. A configuração e as garantias dependem do agendador; -p não transforma watch em um sistema de tempo real.

Controle com o teclado

Tecla Ação
q Sai do watch. O comando filho em execução pode não parar imediatamente.
Ctrl+c Envia um sinal de interrupção para sair tanto do watch quanto da tarefa em execução.
Barra de espaço Solicita a execução do comando sem esperar pelo próximo horário programado. Se já estiver em execução, inicia a próxima execução imediatamente após a conclusão, sem atraso.

As ações das teclas podem variar dependendo da versão do procps-ng, portanto, primeiro verifique o man watch do sistema atual.

Precauções ao usar o watch

  • Prefira consultas de leitura: Repetir comandos que alteram o estado, como exclusão de arquivos, pagamentos, criação de usuários ou reinício de serviços, pode levar a resultados indesejados.
  • Evite intervalos muito curtos: Executar consultas de banco de dados, solicitações de API remota ou buscas em diretórios grandes em intervalos muito curtos pode sobrecarregar o sistema ou serviços externos.
  • Confira a área visível da tela: -g e -d são afetados pela saída exibida no terminal, então alterações na área truncada podem não ser detectadas.
  • Evite comandos interativos: Programas que aguardam entrada do usuário, como prompts de senha, editores ou paginadores, não são adequados para execução repetida.
  • Distinga os estados de saída: O status de sucesso do watch básico nem sempre significa que o comando repetido foi bem-sucedido. Se você precisar responder a erros de comando, verifique opções como -e na versão atual.

Quando outras ferramentas são mais adequadas do que watch

Objetivo Ferramentas apropriadas
Monitorando logs que estão sendo adicionados a um arquivo tail -f ou tail -F
Monitorando logs de serviços do systemd journalctl -f -u nome-do-servico
Verificando o uso de recursos do processo top ou htop
Tarefas repetitivas programadas timer do systemd ou cron
Coleta de métricas e alertas de longo prazo Sistema de monitoramento dedicado

watch é adequado para uma pessoa observar mudanças de curto prazo no terminal. Se você precisar de registro, notificações e análise de longo prazo, deve escolher uma ferramenta adequada para esse propósito.

Perguntas frequentes

O que fazer se o comando watch não existir?

watch geralmente está incluído no pacote procps ou procps-ng. Pode não estar presente em ambientes de instalação mínima, então você precisará instalar o pacote usando o gerenciador de pacotes da sua distribuição atual. Verifique a documentação da distribuição para o nome do pacote e o comando de instalação.

Por que aliases ou funções não funcionam dentro de watch?

Aliases e funções podem ser definidos apenas no shell interativo atual, e podem não ser passados para o ambiente sh -c que watch chama por padrão. Para tarefas repetitivas, é mais fácil e previsível usar o executável real, um comando explícito ou um script de shell separado.

Por que as cores do comando não aparecem?

Habilite a interpretação de cores ANSI com watch -c e configure o comando repetido para gerar códigos de cores em ambientes não interativos também. Dependendo do programa, uma opção separada como --color=always pode ser necessária.

Por que comandos que incluem pipes devem ser colocados entre aspas?

Sem aspas, o shell atual pode processar o pipe primeiro, fazendo com que toda a saída do watch seja passada para outro comando. Colocar todo o pipeline entre aspas simples permite que watch o passe como uma única string de comando para o shell que irá executá-lo repetidamente.

Resumo

watch é uma ferramenta de observação simples que exibe repetidamente os resultados de um comando no intervalo padrão de 2 segundos. Você pode alterar o intervalo com -n, destacar mudanças com -d e sair quando a saída mudar com -g.

Comandos que incluem pipes e redirecionamento devem ser completamente colocados entre aspas simples, e a carga e os efeitos colaterais da execução repetida no sistema devem ser verificados. Você pode encontrar os propósitos de outros comandos por tarefa na referência de comandos do Linux por tarefa.