我正在运行这样的模拟
./waf --run scratch/myfile | awk -f filter.awk
一旦filter.awk检测到发生了什么事情(例如在读取特定行之后),我怎样才能杀死waf命令?
我不能更改waf或myfile 。 我只能改变filter.awk和上面的命令(显然)。
更新后的评论:
awk格式化csv文件| unix | Solaris | AWK
Python从csv中删除负数条目/行
如果等于特定值,则更换列
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] 举报,一经查实,本站将立刻删除。