在管道中杀死上一个命令

时间:2013-02-15 16:43:40

标签: linux bash awk waf ns-3

我正在运行这样的模拟

./waf --run scratch/myfile | awk -f filter.awk 

如果waf检测到发生了某些事情(例如,在读取特定行之后),我该如何终止filter.awk命令?

我无法更改wafmyfile。我只能更改filter.awk和上面的命令(显然)。

评论后更新:

    收到waf后,
  • SIGPIPE没有终止(因为它应该?)
  • 它产生了需要清理的子进程。

这是my own answer (和挑战)


在研究了@theotherguy的ans @ Chris的答案后,我简化了一下并得到了这个:

tmp=$(mktemp)
{ ./waf --run scratch/myfile & echo $! > "$tmp"; } | { awk -f filter.awk; pkill -P $(<$tmp); kill $(<$tmp); }

不幸的是我无法摆脱tmp文件,每次尝试将PID作为变量传递失败。

我不会更改已接受的答案(因为它是真正需要时有效的那个),但对于任何可以简化更多的人来说都是+1。

3 个答案:

答案 0 :(得分:4)

使用awk的{​​{1}}声明。连接到exit的管道关闭后,waf应立即退出。

答案 1 :(得分:2)

令人困惑的是waf因管道断裂而没有退出而导致行为不端,并且它产生了我们也必须摆脱的第二个过程:

tmp=$(mktemp)
cat <(./waf --run scratch/myfile & echo $! > "$tmp"; wait) | awk -f filter.awk; 
pkill -P $(<$tmp)
kill $(<$tmp)
  • 我们使用<(process substitution)在后​​台运行waf并将其pid写入临时文件。
  • 我们使用cat作为中介来将此流程的数据中继到awk,因为当管道损坏时cat将正确退出,从而允许管道完成。
  • 管道完成后,我们会终止waf已生成的所有进程(通过父PID)
  • 最后我们杀了waf本身。

答案 2 :(得分:1)

awk退出时,waf在下次尝试写输出时会获得SIGPIPE,这会导致它退出,除非写waf的任何人故意设置它忽略SIGPIPE告诉它退出,在这种情况下你必须用kill或其他一些手动杀死它。类似的东西:

./waf --run scratch/myfile | ( awk -f filter.awk; killall waf )

如果-KILL忽略所有退出信号,则killall可能需要waf个选项。

相关问题