Como posso monitorar um arquivo que recria completamente durante sua execução?

3

Esta é uma pergunta de seguimento de

Why are some file changes not shown in tail -f?

Com o uso de capital F: tail -F posso monitorar a saída de

tail -F ~/.mysql_history

do manual:

--retry
      keep trying to open a file even if it is inaccessible when  tail
      starts  or if it becomes inaccessible later; useful when follow-
      ing by name, i.e., with --follow=name

-f, --follow[={name|descriptor}]
      output appended data as the file grows; -f, --follow, and --fol-
      low=descriptor are equivalent

-F     same as --follow=name --retry

mas o arquivo inteiro é adicionado à saída toda vez que ele muda.

Existe uma maneira de alterar corretamente o arquivo .mysql_history ?

Eu também tentei

tail --follow=name ~/.mysql_history 

mas depois obtenho o mesmo comportamento e, além disso, cada vez que o arquivo de histórico é alterado:

tail: '.mysql_history' has been replaced; following end of new file

(usando LC_ALL=C tail --follow=name ~/.mysql_history para receber a mensagem de erro em inglês)

Meu objetivo final é redirecionar a saída completa de todas as alterações no histórico do mysql para outro arquivo, mas isso não é satisfatório:

tail -F ~/.mysql_history >> ~/.mysql_complete_history
    
por rubo77 30.11.2013 / 07:25

2 respostas

2

Você poderia tentar algo como:

perl -e '
  $f = shift;
  while (open F, "<", $f) {
    seek F, $n, 0;
    while (<F>) {print};
    $n = tell F;
    sleep 1;
  }' ~/.mysql_history

tail -f lê o final do arquivo e, em seguida, fica lá tentando ler qualquer material novo a cada segundo. O mesmo acontece com tail -F , mas também verifica se o descritor de arquivo atual ainda está apontando para a mesma entrada de diretório e inicia com o novo arquivo, se necessário.

Aqui, vamos mais longe. A ideia é reabrir o arquivo a cada segundo e procurar de volta para onde o deixamos da última vez.

    
por 30.11.2013 / 08:41
1

Se bem entendi, você precisa de um plugin de auditoria. Existem várias implementações gratuitas, procure por McAfee MySQL Audit Plugin, Plugin de Auditoria MariaDB para MySQL. A Oracle também oferece uma implementação comercial para seu Enterprise MySQL Server.

    
por 30.11.2013 / 15:05