bash - 如何使用计时器监控命令的标准输出?
问题描述
我想知道应用程序何时没有在标准输出中打印一行 N 秒。
这是一个可重现的示例:
#!/bin/bash
dmesg -w | {
while IFS= read -t 3 -r line
do
echo "$line"
done
echo "NO NEW LINE"
}
echo "END"
我可以看到NO NEW LINE
但管道没有停止并且 bash 没有继续。END
从不显示。
- 如何退出大括号的代码?
资料来源:https ://unix.stackexchange.com/questions/117501/in-bash-script-how-to-capture-stdout-line-by-line
解决方案
如何退出方括号的代码?
并非所有命令在无法写入输出或接收SIGPIPE
时都会退出,并且在真正注意到无法写入输出之前它们不会退出。相反,在后台运行该命令。如果不打算wait
在进程上,在 bash 中你可以只使用进程替换:
{
while IFS= read -t 3 -r line; do
printf "%s\n" "$line"
done
echo "end"
} < <(dmesg -w)
您也可以使用协同处理。或者只是在后台使用管道运行命令,kill
然后在完成后运行。
推荐阅读
- html - 轮播中的图像闪烁
- python - 蟒蛇 | 从多个 csv 文件中读取并添加到嵌套列表中
- php - 如何在 Symfony 4 的 .env 文件中配置 MAILER_URL 以使用 Swift_Mailer 通过 sendmail 发送电子邮件?
- android - 向 ArrayObjectAdapter 实例添加第二个 Presenter
- java - Recyclerview 适配器中任何列表项的总和值
- python - Pandas 按行值拆分/分组数据帧
- php - PHP eval():: 使用未定义常量 not_a_constant- 假定为 'not_a_constant' php 7.2
- angular - 如何从 Electron + angular 在 adobe 中打开 pdf
- vis.js - Visjs 时间线编辑内容项模板
- java - 访问被拒绝:超级账本结构 channel.initialize()