Shell脚本在后台运行进程,如果先前的进程包含字符串,则解析其输出并启动服务

问题描述 投票:-1回答:1

我需要编写一个shell脚本,该脚本在后台启动进程并解析其输出,直到它检查输出的输出中不包含任何错误为止。该进程将继续在后台运行,因为它需要侦听端口。如果过程输出包含错误,请退出脚本。

基于上一个进程的输出(它不包含任何错误,该进程能够建立与DB的连接),运行下一个命令。

我尝试了关于堆栈溢出的许多建议方法,其中包括:

/home/build/a_process 2>&1 | tee "output_$(date +"%Y_%m_%d").log"
tail -fn0 "output_$(date +"%Y_%m_%d").log" | \
while read line ; do
if [ echo "$line" | grep "Listening" ]
then
/home/build/b_process 2>&1 | tee "output_script_$(date +"%Y_%m_%d").log"
elif [ echo "$line" | grep "error occurred in load configuration" ] || [ echo "$line" | grep "Binding Failure" ]
then
sl -e
fi
done

问题是,尽管该进程包含我正在搜索的文本,但该进程仍在继续运行,但该进程陷入了解析凝视而无法退出而无法观看输出或拖尾的情况。结果,它无法执行下一个命令。

linux bash shell process
1个回答
0
投票

表面上,问题在于“ tee”命令(a_process ... | tee)。

回想一下,管道将进入外壳

  1. 在命令之间创建管道
  2. 等待LAST命令完成。

由于tee在a_process完成之前不会完成,并且因为a_process是守护程序,所以您的脚本可能会永远等待(至少直到a_process退出)。

在这种情况下,请考虑将整个管道发送到后台。

log_file=output_$(date +"%Y_%m_%d").log
( /home/build/a_process 2>&1 | tee "$logfile" ) &
tail -fn0 "$logfile" | 
...

旁注:考虑将日志文件设置为变量。这将使维护(和理解)脚本更加容易。

© www.soinside.com 2019 - 2024. All rights reserved.