Linux: Alertar usuário quando um arquivo é alterado

4

Aqui está uma questão de uso mais geral.

Como posso monitorar um arquivo de log para alterações específicas e usar um alerta "notify-send" no Ubuntu para alertar quando essas mudanças ocorrem?

PERGUNTA ORIGINAL:

I'm attempting to set up print quotas for printers here at the office. However, it appears when the quota is reached, the print just fails silently, and the user doesn't have any idea what's happening.

Page quota's set up by altering the PageLimit directive in /etc/cups/printers.conf

It appears I'm getting the message

E [04/Mar/2013:15:34:28 -0700] Returning IPP client-error-not-possible for Create-Job (ipp://localhost:631/printers/Hewlett-Packard-HP-LaserJet-4100-MFP) from localhost

     

no meu log em / var / log / cups / error_log.

     

Eu tentei invadir algo por meio de um comando como

'tail -f /var/log/cups/error_log | grep 'client-error-not-possible for Create-Job' DISPLAY=:0 notify-send -t 30000 -i 'notification-message-email' 'Printing Quota reached for this Printer''
     

Mas isso não parece funcionar, pois exibe apenas a mensagem   uma vez na primeira mensagem de erro.

     

Quaisquer pensamentos ou soluções? Parece mesmo que deveria haver um   solução pré-cozida para isso.

SOLUÇÃO

incrontab funcionou perfeitamente.

sudo apt-get install incrontab

Adicione o usuário root a /etc/incron.allow

sudo nano /etc/incron.allow

Crie o script monitorCUPSlog.sh

#!/bin/bash
tail -n 1 /var/log/cups/error_log | grep 'client-error-not-possible' | DISPLAY=:0 notify-send -t 30000 -i 'notification-message-email' 'Daily Print Quota exceeded for this printer'

E finalmente adicione o evento à tabela incrontab

sudo incrontab -e
/var/log/cups/error_log IN_MODIFY /usr/local/bin/monitorCUPSlog.sh

Parece funcionar, sim.

    
por Sheldon Ross 04.03.2013 / 23:45

2 respostas

5

Eu procuraria usar o incrontab para monitorar as alterações no sistema de arquivos e combinar isso com o pequeno script você já tem.

Isso parece aproximadamente o seguinte.

Primeiro, salve o script que você deseja executar como um arquivo, por exemplo, como cups_monitor.sh em /usr/local/bin (não esqueça de torná-lo executável).

#!/bin/sh
VAR='tail -n 1 /var/log/cups/error_log | grep 'client-error-not-possible for Create-Job''
if [[ -n "$VAR" ]]; then
   echo "$VAR" | DISPLAY=:0 notify-send -t 30000 -i
fi

Você pode querer verificar isso. Meus scripts nunca estão certos primeiro tente :). Observe também que é possível que este script não capture sua mensagem de erro se for seguido por outra mensagem: Eu vejo apenas a última linha do arquivo de log ( -n 1 ); isso deve ser fácil de mudar.

Em seguida, edite seu incrontab

incrontab -e

adicionando a linha

/var/log/cups/error_log IN_CLOSE_WRITE /usr/local/bin/cups_monitor.sh

O IN_CLOSE_WRITE é chamado de 'símbolo de evento' e indica que você deseja chamar seu script quando /var/log/cups/error_log foi fechado depois de ter sido aberto para gravação; você pode encontrar outros eventos na página man do incrontab.

Tenha em mente que não testei isso. Você pode ver se o arquivo incrontab foi alterado com sucesso e se ele chama seu script ou não, procurando no syslog ( tail /var/log/syslog ).

(Minha primeira resposta no Stack Exchange já! Yippee!)

    
por 05.03.2013 / 00:14
0

Você pode usar incron :: inotify para anexar gatilhos personalizados em arquivos que faça coisas como criar entradas de arquivo de log ou enviar e-mails após eventos de alteração.

    
por 04.03.2013 / 23:58