这是一个更普遍使用的问题。
如何监视日志文件中的特定更改,并在发生上述更改时使用 Ubuntu 中的“通知发送”警报发出警报?
原始问题:
我正在尝试为办公室里的打印机设置打印配额。但是,当达到配额时,打印似乎会默默失败,而用户根本不知道发生了什么。
通过修改 /etc/cups/printers.conf 中的 PageLimit 指令来设置页面配额
我似乎收到了消息
E [04/Mar/2013:15:34:28 -0700] 从本地主机返回 IPP 客户端错误,无法创建作业(ipp://localhost:631/printers/Hewlett-Packard-HP-LaserJet-4100-MFP)
在我的日志 /var/log/cups/error_log 中。
我尝试通过如下命令进行一些破解
`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'`
但这似乎并没有真正起作用,因为它只在第一个错误消息上显示一次消息。
有什么想法或解决方案吗?看来确实应该有一个预先解决此问题的解决方案。
解决方案
incrontab 运行完美。
sudo apt-get install incrontab
将用户 root 添加到 /etc/incron.allow
sudo nano /etc/incron.allow
创建脚本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'
最后将事件添加到 incrontab 表中
sudo incrontab -e
/var/log/cups/error_log IN_MODIFY /usr/local/bin/monitorCUPSlog.sh
看起来有效,耶。
答案1
我会考虑使用定时任务用于监视文件系统的变化,并将其与您已有的小脚本结合起来。
大致如下。
首先,将要执行的脚本保存为文件,例如cups_monitor.sh
(/usr/local/bin
不要忘记使其可执行)。
#!/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
您可能想检查一下。我的脚本第一次尝试总是不正确 :)。还请注意,如果错误消息后面跟着其他消息,则此脚本可能无法捕获您的错误消息:我只查看日志文件的最后一行(-n 1
);这应该很容易更改。
然后编辑你的 incrontab
incrontab -e
通过添加行
/var/log/cups/error_log IN_CLOSE_WRITE /usr/local/bin/cups_monitor.sh
被IN_CLOSE_WRITE
称为“事件符号”,表示您想要在脚本/var/log/cups/error_log
打开进行写入后关闭时调用它;您可以在 incrontab 的手册页中找到其他事件。
请记住,我没有测试过这一点。您可以通过查看 syslog ( tail /var/log/syslog
) 来查看 incrontab 文件是否已成功更改以及它是否调用了您的脚本。
(这是我在 Stack Exchange 上的第一个答案!耶!)
答案2
您可以使用incron::inotify在文件上附加自定义触发器,执行诸如创建日志文件条目或在事件发生变化时发送电子邮件之类的操作。