【发布时间】:2010-07-27 15:52:58
【问题描述】:
考虑以下简化示例:
my_prog|awk '...' > output.csv &
my_pid="$!" #Gives the PID for awk instead of for my_prog
sleep 10
kill $my_pid #my_prog still has data in its buffer that awk never saw. Data is lost!
在 bash 中,$my_pid 指向 awk 的 PID。但是,我需要my_prog 的 PID。如果我杀死awk,my_prog 不知道刷新它的输出缓冲区并且数据丢失。那么,如何获得my_prog 的PID?请注意,ps aux|grep my_prog 将不起作用,因为可能有多个 my_prog 正在运行。
注意:将 cat 更改为 awk '...' 以帮助澄清我的需求。
【问题讨论】:
-
我并没有真正通过管道连接到 cat,这只是一个简化的示例。这确实是一个丑陋的 awk 脚本,但它们的行为方式相同。
-
你想完成什么?我相信一定有更好的方法。
-
我有一个程序 my_prog,它可以生成大量数据。我使用 awk 脚本将数据汇总到 CSV 文件中,该文件将作为报告的基础。该程序实际上输出数据很好,直到我开始管道它。我相信这与 C 的“setbuf”特性有关,它将终端视为行缓冲,文件视为块缓冲(在这一点上我可能错了)。但也许如果我可以让程序在与 awk 对话时误以为它正在向终端写入数据,那可能会奏效。如果 my_prog 在退出时刷新它的缓冲区,如果我能得到 PID,那就更容易了。
-
我更新了问题以澄清。谢谢你的慰问。也许有更简单的方法。