我正在尝试编写一个运行进程的bash脚本,并逐行解析其输出(如here)。
我还希望得到进程PID,这样我可以运行每一行ps并获得CPU和内存使用(并用输出行打印它们)。
我知道如果我在后台运行该过程,我可以使用$!
获取PID,但后来我不知道如何读取输出。
提前致谢
答案 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}"