linux – 在管道中杀死上一个命令

linux – 在管道中杀死上一个命令,第1张

概述我正在运行这样的模拟 ./waf --run scratch/myfile | awk -f filter.awk 如果filter.awk检测到发生了某些事情(例如在读取特定行之后),我怎么能杀死waf命令? 我不能改变waf或myfile.我只能更改filter.awk和上面的命令(显然). 评论后更新: > waf在收到SIGPIPE后没有终止(因为它应该?) >它产生了需要清理的子进程. 我正在运行这样的模拟

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

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

我不能改变waf或myfile.我只能更改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.

解决方法 是什么让这个棘手的是,当管道断裂时,waf行为不当,它产生了第二个过程,我们也必须摆脱它:

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

>我们使用<(进程替换)在后台运行waf并将其pID写入临时文件.>我们使用cat作为中介来将数据从此进程中继到awk,因为cat会在管道损坏时正常退出,从而允许管道完成.>管道完成后,我们会杀死所有已生成的进程(通过父PID)>最后我们杀了waf本身.

总结

以上是内存溢出为你收集整理的linux – 在管道中杀死上一个命令全部内容,希望文章能够帮你解决linux – 在管道中杀死上一个命令所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1022002.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存