微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在pipe道中杀死前面的命令

我正在运行这样的模拟

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

一旦filter.awk检测到发生了什么事情(例如在读取特定行之后),我怎样才能杀死waf命令?

我不能更改waf或myfile 。 我只能改变filter.awk和上面的命令(显然)。

更新后的评论

awk格式化csv文件| unix | Solaris | AWK

Python从csv中删除负数条目/行

使用UNIX删除文本文件中的某些行

Linux,打印一个文件中的所有行,而不是以

如果等于特定值,则更换列

waf在收到SIGPIPE后没有终止(因为它应该?)

它产生了需要清理的subprocess。

这是我自己的答案 (和挑战) 。

在@ thatotherguy的ans @ Chris的答案上工作之后,我简化了一下,得到了这个:

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

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

我不会改变被接受的答案(因为它是真正需要的时候才起作用的),但对任何可以简化的人来说都是+1。

bash首先迭代打印到第n列

按小时计数

将CSV值导入Bash

用awk或sedreplace和增加字母和数字

合并很多大型CSV文件(在Linux中)

是什么让这个棘手的是,当管道破裂时, waf因为没有退出而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本身。

使用awk的exit语句。 waf应该在连接awk的管道关闭后立即退出

当awk退出时, waf在下次尝试写输出的时候得到一个SIGPIPE ,这会导致它退出,除非写了waf故意设置它忽略SIGPIPE告诉它退出在这种情况下,你将不得不杀掉它手动kill或一些这样的。 就像是:

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐