Linux 等待日志文件中特定字符串的Bash脚本优化
我使用的是一个bash脚本,它调用多个进程,这些进程必须按特定顺序启动,并且在启动下一个进程之前必须完成某些操作(然后它们将某些消息打印到日志中)。bash脚本具有以下代码,在大多数情况下都非常有效:Linux 等待日志文件中特定字符串的Bash脚本优化,linux,bash,shell,Linux,Bash,Shell,我使用的是一个bash脚本,它调用多个进程,这些进程必须按特定顺序启动,并且在启动下一个进程之前必须完成某些操作(然后它们将某些消息打印到日志中)。bash脚本具有以下代码,在大多数情况下都非常有效: tail -Fn +1 "$log_file" | while read line; do if echo "$line" | grep -qEi "$search_text"; then echo "[INFO] $process_name process started
tail -Fn +1 "$log_file" | while read line; do
if echo "$line" | grep -qEi "$search_text"; then
echo "[INFO] $process_name process started up successfully"
pkill -9 -P $$ tail
return 0
elif echo "$line" | grep -qEi '^error\b'; then
echo "[INFO] ERROR or Exception is thrown listed below. $process_name process startup aborted"
echo " ($line) "
echo "[INFO] Please check $process_name process log file=$log_file for problems"
pkill -9 -P $$ tail
return 1
fi
done
但是,当我们将进程设置为在调试模式下打印日志时,它们打印的日志太多,以致于此脚本无法跟上,并且在进程完成后大约需要15分钟bash脚本才能跟上。有没有办法对此进行优化,例如将“while read line”更改为“while read 100 line”之类的内容?每个日志行最多不分叉两个
grep
进程如何
tail -Fn +1 "$log_file" | grep -Ei "$search_text|^error\b" | while read line; do
因此,如果您愿意,一个长时间运行的grep
进程将进行预处理
编辑:如注释中所述,在
grep
调用中添加--line buffered
更安全。与此脚本相关的一些提示:
- 检查守护进程启动比查看日志输出要好得多
- 您可以使用
grep。。。它有时能工作,但其他的却不行(挂起)-一些关于SO的研究表明,我还需要添加行缓冲区(grep--line buffered-qEi“$search\u text | ^error\b”),以保证grep的输出一经发现就立即发送到read line,而不是在grep的内部缓冲区中丢失,我想我真的在那里犯了个错误。它应该是
,因为grep-Ei
将删除实际匹配的行。啊!(这对你是如何起作用的,我现在有点不明白;)啊,是的,我的错-我确实注意到了,把“q”拿出来,忘了回复:)但是如果你不输入缓冲行,如果你要查找的行是文件中的最后一行,它将不起作用,除非完全有可能该行是填充grep页面缓冲区的行grep-qEi