-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

问题是,尽管该过程包含我正在搜索的文本,但它仍在继续运行,它在解析凝视时卡住了,并且永远无法退出观看输出或拖尾。结果它无法执行下一个命令。

4

1 回答 1

0

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

回想一下,管道将导致 shell

  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" | 
...

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

于 2019-10-19T19:10:46.567 回答