Um script de shell pode esperar que um arquivo seja alterado e tome uma ação?

12

Gostaria de saber se posso escrever um script que monitore uma alteração em um arquivo e execute alguma ação quando a alteração for detectada.

Explicação detalhada:

  1. O OpenVPN grava seu status em um arquivo a cada 1 minuto.
  2. Preciso analisar esse arquivo de status e tomar uma ação.
  3. O OpenVPN trunca o arquivo de status antes de gravá-lo.
  4. Tentei gravar em um pipe nomeado, mas recebo erros indesejáveis ​​(mas não fatais) no aplicativo quando ele falha ao truncar o pipe.
davidparks21
fonte
Caso a modificação seja realmente anexada ao arquivo, aguardar tail -fprovavelmente é a maneira mais fácil. Mas apenas para anexar.
SF.

Respostas:

21

Cheap n 'maneira suja:

Faça um loop stat -c %Y filee execute uma ação quando a hora da modificação mudar.

Provavelmente melhor:

Use o serviço inotify cron para observar eventos de modificação de arquivo e executar sua ação:

/path/to/your/file IN_MODIFY /path/to/your/script $#
Cakemox
fonte
+1 para a segunda solução
Michael Lowman
2

inotify seria o caminho certo para fazê-lo. Tutoriais são fornecidos em algumas edições da revista LinuxForYou para esta pergunta.

Suhail Sherif
fonte
0

Então, tenha um script que:

1) Verifica o tempo de modificação no arquivo (com stat)
2) Se o tempo de modificação é mais recente do que quando foi verificado pela última vez, ele foi alterado
3) Analise e execute sua ação
4) Depois, durma por 1 minuto e, em seguida, refaça

Rafiq Maniar
fonte
0

Maneira rápida e suja:

function wait_file_changed {
    tail -fn0 "$1" | head -n1
}

wait_file_changed /tmp/potato
dctremblay
fonte