Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 等待日志文件中特定字符串的Bash脚本优化_Linux_Bash_Shell - Fatal编程技术网

Linux 等待日志文件中特定字符串的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

我使用的是一个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 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
    ,因为
    grep-qEi
    将删除实际匹配的行。啊!(这对你是如何起作用的,我现在有点不明白;)啊,是的,我的错-我确实注意到了,把“q”拿出来,忘了回复:)但是如果你不输入缓冲行,如果你要查找的行是文件中的最后一行,它将不起作用,除非完全有可能该行是填充grep页面缓冲区的行