Bash - 获取进程pid并逐行解析输出

时间:2017-11-13 08:54:35

标签: linux bash

我正在尝试编写一个运行进程的bash脚本,并逐行解析其输出(如here)。

我还希望得到进程PID,这样我可以运行每一行ps并获得CPU和内存使用(并用输出行打印它们)。

我知道如果我在后台运行该过程,我可以使用$!获取PID,但后来我不知道如何读取输出。

提前致谢

1 个答案:

答案 0 :(得分:2)

您可以创建FIFO并在后台进程运行时读取它。对于您阅读的每一行,您可以使用child_pid执行任何操作。

首先我们需要一个小样本程序:

bgp() { sleep 1; echo 1; sleep 1; echo 2; sleep 1; echo 3; }

然后创建一个fifo(可能在/ tmp中选择一些路径)

tmp_fifo="/tmp/my_fifo"
rm "${tmp_fifo}" &>/dev/null
mkfifo "${tmp_fifo}"

在后台启动您的流程并将输出重定向到FIFO:

bgp > "${tmp_fifo}" &
child_pid=$!

现在读取输出,直到子进程终止。

while true; do
    if jobs %% >&/dev/null; then
        if read -r -u 9 line; then
            # Do whatever with $child_pid
            echo -n "output from [$child_pid]: "
            echo $line
        fi
    else
        echo "info: child finished or died"
        break
    fi
done 9< "${tmp_fifo}"