我的 Bash 脚本作为 cron 作业执行。它在日志文件中查找字符串,如果找到,则应通过邮件转发相应的日志条目。
我的脚本可以工作,但我已经报告的日志条目包含相同的字符串,但时间戳较早。我想修改它,以便它只发送感兴趣的日志条目的最新时间戳。
#!/bin/bash
grep "Too many files" /share/logs/access.log > /dev/null && grep "Too many files" /share/logs/access.log | mailx -s "Batch Error " to [email protected]
相应的 cron 作业每 10 分钟运行一次:
*/10 * * * * /myscripts/joberror.sh
我寻找的日志条目access.log
如下所示:
uzeadnos12 2020-10-14 13:29:00,443 ERROR - Error occured while converting document using Libreoffice - /shard.tiff java.io.IOException: Cannot run program "": error=24, Too many open files
有人可以帮我改进该脚本吗?
答案1
创建一个容器(例如,一个文件~/spool/last_jobrec
),您可以在其中记录 cron 作业记录的最后一个时间戳。将其与最后附加日志条目的时间戳进行比较。当两者不同时会发出通知,当两者相同时则不执行任何操作。
$ mkdir -p /path/to/spool # choose a place for spool directory.
$
$ cat /myscripts/joberror.sh
#!/bin/bash
touch /path/to/spool/last_jobrec # ensure appropriate permissions
latest_logentry=$(grep --no-messages --no-filename --max-count=1 -e "Too many open files" <(tac /share/logs/access.log))
latest_logstamp=$(cut -d' ' -f1,2 <(echo $latest_logentry))
if [ "$latest_logstamp" != "$(cat /path/to/spool/last_jobrec)" ]; then
echo "$latest_logentry" | mailx -s "Batch Error " to [email protected]
echo "$latest_logstamp" >| /path/to/spool/last_jobrec
fi
未经测试。特别是我不使用该mailx
实用程序。
评论:
1)我假设新的日志条目附加在日志文件的末尾。
2)为了填充上面的变量,last_entrystamp
我使用了基于grep
.这是因为我保守地假设您的日志文件可能包含不包含字符串“太多打开文件”的行形式的其他条目。如果没有,只需将grep
脚本中的行替换为 withlatest_logentry=$(tail -1 /share/logs/access.log)