it-swarm-pt.tech

Comando Shell para monitorar alterações em um arquivo

Eu sei que havia um comando no Unix que eu poderia usar para monitorar um arquivo e ver as alterações que estão sendo gravadas nele. Isso foi bastante útil, especialmente para verificar arquivos de log.

Você sabe como é chamado?

167
Sebastian Hoitz

Você quer dizer

tail -f logfile.log

?

( Página de manual da cauda )

220
Jon Skeet

Você provavelmente quis dizer cauda, ​​conforme a resposta de Jon Skeet.

Outro útil é watch ; Ele permite que você execute um comando periodicamente e veja a saída em tela cheia. Por exemplo:

 assista -n 10 -d ls -l /var/adm/messages

Irá executar o comando ls -l /var/adm/messages a cada 10 segundos e destaque a diferença na saída entre as execuções subseqüentes. (Útil para observar a rapidez com que um arquivo de log está crescendo, por exemplo).

128
Murali Suriar

inotifywait from inotify-tools é útil se você deseja executar um comando sempre que um arquivo (ou qualquer arquivo em um diretório) for alterado. Por exemplo:

inotifywait -r -m -e modify /var/log | 
   while read path _ file; do 
       echo $path$file modified
   done
42
richvdh

Eu prefiro usar less +FG1 sobre tail -f porque eu preciso pesquisar um arquivo de log em busca de um erro ou ID específico. Se eu precisar procurar algo, digite ^C para parar de seguir o arquivo e ? para começar a pesquisar para trás.

As combinações de teclas são praticamente as mesmas que em vi. Qualquer comando pode ser inicializado na inicialização usando o + opção:

+cmd   Causes  the  specified  cmd  to be executed each time a new file is
       examined.  For example, +G causes less to  initially  display  each
       file starting at the end rather than the beginning.

Para logs muito longos, acho conveniente usar o -n opção que desativa a numeração das linhas. Na página de manual:

-n or --line-numbers
          Suppresses line numbers.  The default (to use line numbers)  may
          cause  less  to run more slowly in some cases, especially with a
          very large input file.  Suppressing line  numbers  with  the  -n
          option  will  avoid this problem.  Using line numbers means: the
          line number will be displayed in the verbose Prompt and in the =
          command,  and the v command will pass the current line number to
          the editor (see also  the  discussion  of  LESSEDIT  in  PROMPTS
          below).

1. Dê uma gorjeta para rgmarcha por apontar isso nos comentários.

37
Jon Ericson

A cauda é ótima ... menos também pode ser usado, comece menos no arquivo, ou seja, menos meu arquivo e pressione Shift+F. Isso tem menos ação como cauda.

21
trent

Estou editando um arquivo LaTeX e queria monitorá-lo também para alterações em algum lugar no meio. Criei o seguinte pequeno script do Shell que se mostrou útil para mim. Espero que também seja útil para outra pessoa.

#!/bin/bash
FILE="$1"
CMD="$2"
LAST=`ls -l "$FILE"`
while true; do
  sleep 1
  NEW=`ls -l "$FILE"`
  if [ "$NEW" != "$LAST" ]; then
    "$CMD" "$FILE"
    LAST="$NEW"
  fi
done

Salve-o como watch.sh e fazer chmod u+x watch.sh. Então eu executo da seguinte maneira:

./watch.sh file.tex pdflatex

Se você deseja que o comando seja executado apenas se a modificação real ocorrer, use `md5sum "$FILE"` ao invés de `ls -l "$FILE"`.

16
oliphaunt

você pode usar o comando tailf o mais fácil

tailf logfile.log
8
reegan vijay

Você também pode usar o inotifywatch/inotifywait que se conecta ao subsistema inotify do kernels. Dessa forma, você também pode assistir a coisas como "abrir", "fechar" ou "acessar".

Mas se você simplesmente deseja obter linhas anexadas ao stdout, eu concordo na cauda.

6
Martin

Tail é a ferramenta padrão, tradicional, disponível em qualquer lugar da ferramenta unix. Uma ferramenta um pouco mais sofisticada é multitail , que pode monitorar vários arquivos simultaneamente e realça a sintaxe.

3
hlovdal

Se eu quiser pesquisar o arquivo além de apenas segui-lo, uso menos com o comando "F".

Ao usar o tail, lembre-se de que argumentos adicionais são necessários se o arquivo estiver passando por cima ou substituído por edit (modo padrão para o vim: w).

tail -f fará com que o tail armazene o descritor de arquivos e o siga. Se o arquivo for substituído, o descritor será alterado. O benefício de seguir o descritor de arquivo é que, se o arquivo for renomeado, você ainda o seguirá.

tail --follow = fará com que tail rastreie o arquivo nomeado, reabrindo-o periodicamente para verificar se ele foi substituído.

--retry é outra opção útil se você deseja personalizar um arquivo de log, mas o arquivo ainda não foi criado.

tail -F é um atalho para --follow = --retry.

3
deinspanjer

Esqueça tailf, diff é o comando que você deseja. Aqui está um bom truque para observar as diferenças conforme elas ocorrem em tempo real (ou fecham) entre 2 arquivos ou em um arquivo que está sendo gravado.

Você pode usar esses métodos para modificar o comportamento da maneira que desejar, como gravar as alterações em um arquivo para manter o registro. Brinque com o intervalo de observação ou outras opções para os comandos abaixo.

Você tem um arquivo e deseja assistir à alteração feita:

Então, aqui está o que fazer:

  1. copie o arquivo

    cp file file2
    
  2. escreva um script bash para encontrar as diferenças e atualize o arquivo2

    touch check-differences.sh
    nano check-differences.sh
    chmod 755 check-differences.sh
    
  3. Aqui está uma ideia básica para o script. Faça gravar em um arquivo, se quiser

    #!/bin/bash
    diff file file2
    cp file file2
    
  4. Em seguida, você pode assistir as diferenças na tela usando o relógio

    watch ./check-differences
    

isso será atualizado a cada 2 segundos por padrão. Portanto, se você precisar voltar e lê-los, escreva a saída do diff em um arquivo no script.

Ou use cron para executar seu script regularmente se você não precisar ver a saída.

2
Mezmer

Enquanto tail -f somefile.txt continua rolando com novos dados, eu às vezes prefiro less +G somefile.txt bem como ver uma amostra dos dados mais recentes no arquivo.

1
phantomastray