是的| long-interactive-script - 是否可以避免繁忙的无限循环?

时间:2015-05-13 04:42:48

标签: bash

我对Bash管道的理解是执行a-process | another-process会同时运行a-processanother-process,而不是在开始后者之前等待前者完成。 (否则yes | interactive-script没有意义)。但是如果交互式脚本需要很长时间才能运行,那么yes似乎会打印这么多,而interactive-script可能只需要其中的一些。这种情况让我对一大堆问题感到好奇:

  • 我是否理解yes将一直写入管道,直到脚本终止?
  • 假设我在yes | long-interactive-script运行时做了一些其他的工作。 yes会对我的其他工作产生不可忽视的影响吗?
  • 假设交互式脚本挂起。那股流会在某处累积,以至于最终会耗尽内存并崩溃吗?
  • 假设我只想回答12次。我应该使用(for i in $(seq 12); do echo 'yes'; done) | long-interactive-script,还是会有更优雅的解决方案来完成这项任务?
  • 假设我要完全按照interactive-script的要求回答是。是否有一般方法可以确定interactive-script是否在输入阅读时被阻止,并且仅在这种情况下提供是?

2 个答案:

答案 0 :(得分:3)

您缺少的是管道只能容纳有限数量的数据。一旦yes进程填满(这将很快发生 - 毫秒或更短),它将被阻止并且不会再使用CPU时间,直到第二个进程读取一些数据。

在Linux上,您可以使用cat /proc/sys/fs/pipe-max-size查看任何管道的最大限制(尽管可以使用fcntl(fd, F_SETPIPE_SZ, size)在每个管道上降低限制。)

答案 1 :(得分:1)

管道最终将填满,yes将尝试写入并阻止等待stdout变为可用。可忽略不计的内存量(根据this answer在Linux上为64KB)将用于缓冲管道。

相关问题