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.
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.)
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).
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.
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"`.
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.
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.
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.
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:
copie o arquivo
cp file file2
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
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
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.
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.
tail -F
seguirá os nomes dos arquivos em vez dos objetos de arquivo, o que é especialmente útil em caso de rotação do arquivo de log.tailf
agora está obsoleta etail -f
é segura. (confirme isso em seu sistema comman tailf
.) Consulte a documentação: man7.org/linux/man-pages/man1/tailf.1.htmlVocê 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:
Irá executar o comando a
ls -l /var/adm/messages
cada 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).fonte
inotifywait
O inotify-tools é útil se você deseja executar um comando sempre que um arquivo (ou qualquer arquivo de um diretório) for alterado. Por exemplo:fonte
path
não é a melhor opção para um nome de variável. Emzsh
, parece que os vários ambientes não diferenciam maiúsculas de minúsculas. Para mim, definirpath
causasPATH
também é definido, e isso basicamente significa que nada será executado até que você corrija isso. Ativadobash
, a configuraçãopath
não tem efeitoPATH
.Prefiro usar
less +FG
1 aotail -f
invés de precisar pesquisar um arquivo de log em busca de um ID ou erro específico. Se eu precisar procurar algo, digite^C
para 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:Para logs realmente longos, acho conveniente usar a
-n
opção que desativa a numeração de linhas. Na página de manual:1. Dê uma gorjeta ao rgmarcha por apontar isso nos comentários.
fonte
alias
com as opções desejadas, para que você não precise digitá-las todas as vezes.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.
fonte
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.
Salve como
watch.sh
e façachmod 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"`
.fonte
NEW=`tree -sDct . -I 'ignore_pattern|another_pattern'`
você pode usar o comando tailf, o mais fácil
fonte
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.
fonte
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.
fonte
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.
fonte
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:
cp file file2
touch check-differences.sh
nano check-differences.sh
chmod 755 check-differences.sh
#!/bin/bash
diff file file2
cp file file2
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.
fonte
Enquanto
tail -f somefile.txt
continua rolando com novos dados, às vezes também prefiroless +G somefile.txt
olhar para um patch dos dados mais recentes do arquivo.fonte