Comando Shell para monitorar alterações em um arquivo
772
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ê provavelmente quis dizer cauda, de acordo com 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
Executará o comando a ls -l /var/adm/messagescada 10 segundos e destacará a diferença na saída entre as execuções subsequentes. (Útil para observar a rapidez com que um arquivo de log está crescendo, por exemplo).
inotifywaitfrom inotify-tools é útil se você deseja executar um comando toda vez que um arquivo (ou qualquer arquivo em um diretório) for alterado. Por exemplo:
inotifywait -r -m -e modify /var/log |
while read file_path file_event file_name; do
echo ${file_path}${file_name} event: ${file_event}
done
resultado:
Setting up watches. Beware: since -r was given, this may take a while!
Watches established.
/var/log/messages event: MODIFY
/var/log/kern event: MODIFY
...
Prefiro usar less +FG1tail -f porque preciso pesquisar um arquivo de log para um erro ou ID específico . Se eu precisar pesquisar algo, digito ^Cpara parar de seguir o arquivo e ?começar a pesquisar para trás.
As associações de teclas são praticamente as mesmas que no 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 muito longos, acho conveniente usar a -nopção que desativa a numeração de linha. Da 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. Parabéns ao rgmarcha por apontar isso nos comentários.
Estou editando um arquivo LaTeX e queria monitorá-lo também para alterações em algum lugar no meio. Eu preparei 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 forma:
./watch.sh file.tex pdflatex
Se você quiser que o comando seja executado apenas se a modificação real ocorrer, você pode usar `md5sum "$FILE"`em vez de `ls -l "$FILE"`.
Você também pode usar inotifywatch/inotifywait que se conecta ao subsistema inotify do kernel. Dessa forma, você também pode observar coisas como "abrir", "fechar" ou "acessar".
Mas se você simplesmente deseja obter linhas anexadas ao stdout, concordo com a cauda.
Tail é a ferramenta unix padrão, tradicional, disponível em todos os lugares. Uma ferramenta um pouco mais sofisticada é o multitail que pode monitorar vários arquivos simultaneamente e faz realce de sintaxe.
Se eu quiser pesquisar o arquivo além de apenas segui-lo, uso menos com o comando "F".
Ao usar tail, lembre-se de que argumentos adicionais são necessários se o arquivo puder ser substituído ou substituído por edit (modo padrão para :w do vim).
tail -f <filename>fará com que tail armazene o descritor de arquivo e o siga. Se o arquivo for substituído, o descritor será alterado. A vantagem de seguir o descritor de arquivo é que, se o arquivo for renomeado, você ainda o seguirá.
tail --follow=<filename>fará com que a cauda rastreie o arquivo nomeado reabrindo-o periodicamente para ver se ele foi substituído.
--retryé outra opção útil se você deseja seguir um arquivo de log, mas o arquivo ainda não foi criado.
tail -F <filename>é um atalho para --follow=<filename> --retry.
Você quer dizer
?
( Página de manual para cauda )
Você provavelmente quis dizer cauda, de acordo com 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:
Executará o comando a
ls -l /var/adm/messages
cada 10 segundos e destacará a diferença na saída entre as execuções subsequentes. (Útil para observar a rapidez com que um arquivo de log está crescendo, por exemplo).inotifywait
from inotify-tools é útil se você deseja executar um comando toda vez que um arquivo (ou qualquer arquivo em um diretório) for alterado. Por exemplo:resultado:
Prefiro usar
less +FG
1tail -f
porque preciso pesquisar um arquivo de log para um erro ou ID específico . Se eu precisar pesquisar algo, digito^C
para parar de seguir o arquivo e?
começar a pesquisar para trás.As associações de teclas são praticamente as mesmas que no
vi
. Qualquer comando pode ser inicializado na inicialização usando a+
opção:Para logs muito longos, acho conveniente usar a
-n
opção que desativa a numeração de linha. Da página de manual:1. Parabéns ao rgmarcha por apontar isso nos comentários.
tail
é ótimo ...less
também pode ser usado start less no arquivo, ou sejaless myfile
, pressione Shift+ F. Este temless
agir comotail
.Estou editando um arquivo LaTeX e queria monitorá-lo também para alterações em algum lugar no meio. Eu preparei o seguinte pequeno script de shell que se mostrou útil para mim. Espero que também seja útil para outra pessoa.
Salve como
watch.sh
e façachmod u+x watch.sh
. Então eu executo da seguinte forma:./watch.sh file.tex pdflatex
Se você quiser que o comando seja executado apenas se a modificação real ocorrer, você pode usar
`md5sum "$FILE"`
em vez de`ls -l "$FILE"`
.você pode usar o comando tailf é muito mais fácil
Você também pode usar inotifywatch/inotifywait que se conecta ao subsistema inotify do kernel. Dessa forma, você também pode observar coisas como "abrir", "fechar" ou "acessar".
Mas se você simplesmente deseja obter linhas anexadas ao stdout, concordo com a cauda.
Tail é a ferramenta unix padrão, tradicional, disponível em todos os lugares. Uma ferramenta um pouco mais sofisticada é o multitail que pode monitorar vários arquivos simultaneamente e faz realce de sintaxe.
Se eu quiser pesquisar o arquivo além de apenas segui-lo, uso menos com o comando "F".
Ao usar tail, lembre-se de que argumentos adicionais são necessários se o arquivo puder ser substituído ou substituído por edit (modo padrão para :w do vim).
tail -f <filename>
fará com que tail armazene o descritor de arquivo e o siga. Se o arquivo for substituído, o descritor será alterado. A vantagem de seguir o descritor de arquivo é que, se o arquivo for renomeado, você ainda o seguirá.tail --follow=<filename>
fará com que a cauda rastreie o arquivo nomeado reabrindo-o periodicamente para ver se ele foi substituído.--retry
é outra opção útil se você deseja seguir um arquivo de log, mas o arquivo ainda não foi criado.tail -F <filename>
é um atalho para--follow=<filename> --retry
.