Comando Shell para monitorar alterações em um arquivo - Como é chamado novamente?


159

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?

Respostas:


213

Você quer dizer

tail -f logfile.log

?

( Página de manual para cauda )


6
Sim, é em tempo real.
Adam Gibbins

18
Nota: Se sua distribuição fornecer o comando tailf, use isso em preferência para tail -f. tailf é mais eficiente porque ele não precisa acessar o arquivo assistiu, se ele não está sendo escrito para (acessos de votação são irritantes se você montou o sistema de arquivos com atualização atime.)
Mihai Limbăşan

10
No super usuário eu encontrei uma resposta recomendando -F cauda em vez de -f também
Rafa

17
tail -Fseguirá os nomes dos arquivos em vez dos objetos de arquivo, o que é especialmente útil em caso de rotação do arquivo de log.
Amir Ali Akbari

2
Atualização, alguns anos depois: tailfagora está obsoleta e tail -fé segura. (confirme isso em seu sistema com man tailf.) Consulte a documentação: man7.org/linux/man-pages/man1/tailf.1.html
exp1orer

124

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

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

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

Irá executar o comando a ls -l /var/adm/messagescada 10 segundos e destacará 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).


38

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

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

Apenas uma observação que pathnão é a melhor opção para um nome de variável. Em zsh, parece que os vários ambientes não diferenciam maiúsculas de minúsculas. Para mim, definir pathcausas PATHtambém é definido, e isso basicamente significa que nada será executado até que você corrija isso. Ativado bash, a configuração pathnão tem efeito PATH.
Thanatos

36

Prefiro usar less +FG1 ao tail -finvés de precisar pesquisar um arquivo de log em busca de um ID ou erro específico. Se eu precisar procurar algo, digite ^Cpara parar de seguir o arquivo e ?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 a +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 realmente longos, acho conveniente usar a -nopção que desativa a numeração de 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 ao rgmarcha por apontar isso nos comentários.


Lembre-se de definir um aliascom as opções desejadas, para que você não precise digitá-las todas as vezes.
Michael Hampton

Na verdade, você geralmente prefere funções de shell a aliases na maioria dos casos.
Tripleee 3/10

21

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.


5
menos + F myfile irá torná-lo muito
rgmarcha

16

Estou editando um arquivo LaTeX e queria monitorá-lo também para alterações em algum lugar no meio. Criei o seguinte pequeno script de 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 como watch.she faça 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, é possível usar em `md5sum "$FILE"`vez de `ls -l "$FILE"`.


1
assistir diretórios e seu conteúdo, em vez de um único arquivo:NEW=`tree -sDct . -I 'ignore_pattern|another_pattern'`
Andy


6

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.


3

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


3

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 serã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 ver 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.


2

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 do relógio 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

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

  1. Heres uma idéia básica para o script. Faça gravar em um arquivo, se quiser

#!/bin/bash

diff file file2

cp file file2

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


1

Enquanto tail -f somefile.txtcontinua rolando com novos dados, às vezes também prefiro less +G somefile.txtolhar para um patch dos dados mais recentes do arquivo.


4
Penso que tudo está coberto nesta resposta há 7 anos.
kasperd
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.