linux - 从 'timeout' 到 'wc -l' 的管道输出失败

标签 linux console timeout pipe signals

我正在尝试计算给定时间段内的所有击键次数。 目前我的代码如下所示:

$ timeout -s 9 10s xinput test 8 | wc -l

返回

Killed

而不是预期的按键次数。 当我在没有管道的情况下运行超时时,输出符合预期

$ timeout -s 9 20s xinput test 8
key release 36 
key press   42 
key release 42 
key press   26 
key release 26 
key press   28 
key release 28 
key press   38 
key release 38 
key press   46 
key release 46 
key press   31 
key release 31 
key press   41 
key release 41 
key press   26 
key release 26 
Killed

更改信号或添加参数 --preserve-status 都无法解决此问题。

我想知道为什么这不起作用。 “超时”是否以某种方式劫持了 xinputs stdout?

编辑: 但是添加 --foreground 解决了我的问题。不过我不明白为什么。

最佳答案

之所以有效,是因为这样,timeout 命令不会终止任何子进程,从而避免 wc 获取行数。

$ timeout --foreground -s 15 10s xinput test 8 | wc -l

另一种方式是这样的:

$ xinput test 8 > output.log & sleep 10 && wc -l output.log && kill $!

这样,您就不需要超时。第一部分将 xinput 输出重定向到一个文件并将命令发送到后台,然后休眠(等待文件接收到一些数据),在休眠完成后我们运行 wc 并优雅地终止 xinput 后​​台命令。

关于linux - 从 'timeout' 到 'wc -l' 的管道输出失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35088906/

相关文章:

c - 用C语言实时高效处理数据并插入数据库

linux - Apparmor:是否可以从可执行文件中调用另一个可执行文件?

javascript - 对我来说,出乎意料的是,Robot Framework 中的 javascript 返回值。为什么?

linux - 如何创建自己的 Linux 控制台应用程序?

node.js - 是否可以在 node.js 请求中设置无限超时?

python - 如果未及时满足某个条件,则函数超时

linux - 使用 Linux 可加载内核模块拦截系统调用(劫持)

linux - 如何使用 curl 向 Google 发送请求

c# - 如何创建包含前景色等属性的 Cha 信息数组?

Solr 似乎在提交时阻止更新请求