Bash如何监听另一个正在运行的程序的标准输出内容
Bash脚本监听独立进程输出实现方案
前置准备
先给p1.sh添加执行权限:chmod +x p1.sh
方案一:普通日志文件实现(推荐,完全符合先独立运行p1的要求)
这种方案p1运行后不会受p2状态影响,不需要等待p2启动就可以正常执行。
- 独立运行p1.sh并记录PID
执行命令:
执行后p1就会在后台独立运行,PID会被写入./p1.sh | tee p1_output.log & echo $! > p1.pidp1.pid文件中。 - 编写p2.sh代码
#!/bin/bash # 读取p1进程的PID P1_PID=$(cat p1.pid) # 实时监听p1的输出日志,p1退出后tail会自动终止 tail -f --pid="$P1_PID" p1_output.log | while IFS= read -r line; do if [[ "$line" == "goodbye !!" ]]; then echo "p1 said goodbye!" break fi done # 可选:运行结束后清理临时文件 rm -f p1.pid p1_output.log - 运行p2.sh
先给p2.sh添加执行权限:chmod +x p2.sh
直接运行即可:./p2.sh
方案二:命名管道实现(无磁盘IO,性能更高)
这种方案不会产生落地日志,性能更好,缺点是p1启动后需要尽快启动p2,否则p1会因为管道无读进程阻塞。
- 创建命名管道
mkfifo p1_output.fifo - 独立运行p1.sh并记录PID
./p1.sh > p1_output.fifo 2>&1 & echo $! > p1.pid - 编写p2.sh代码
#!/bin/bash P1_PID=$(cat p1.pid) # 从管道读取p1的输出 while IFS= read -r line; do if [[ "$line" == "goodbye !!" ]]; then echo "p1 said goodbye!" break fi done < p1_output.fifo # 清理临时文件 rm -f p1.pid p1_output.fifo - 运行p2.sh
chmod +x p2.sh ./p2.sh
内容的提问来源于stack exchange,提问作者IsaIkari
相关产品推荐
相关产品推荐

