You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash如何监听另一个正在运行的程序的标准输出内容

Bash脚本监听独立进程输出实现方案

前置准备

先给p1.sh添加执行权限:
chmod +x p1.sh


方案一:普通日志文件实现(推荐,完全符合先独立运行p1的要求)

这种方案p1运行后不会受p2状态影响,不需要等待p2启动就可以正常执行。

  1. 独立运行p1.sh并记录PID
    执行命令:
    ./p1.sh | tee p1_output.log & echo $! > p1.pid
    
    执行后p1就会在后台独立运行,PID会被写入p1.pid文件中。
  2. 编写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
    
  3. 运行p2.sh
    先给p2.sh添加执行权限:
    chmod +x p2.sh
    直接运行即可:
    ./p2.sh

方案二:命名管道实现(无磁盘IO,性能更高)

这种方案不会产生落地日志,性能更好,缺点是p1启动后需要尽快启动p2,否则p1会因为管道无读进程阻塞。

  1. 创建命名管道
    mkfifo p1_output.fifo
  2. 独立运行p1.sh并记录PID
    ./p1.sh > p1_output.fifo 2>&1 & echo $! > p1.pid
    
  3. 编写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
    
  4. 运行p2.sh
    chmod +x p2.sh
    ./p2.sh
    

内容的提问来源于stack exchange,提问作者IsaIkari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:06:03