![即使生产者退出,如何让消费者保持活力](https://linux22.com/image/157824/%E5%8D%B3%E4%BD%BF%E7%94%9F%E4%BA%A7%E8%80%85%E9%80%80%E5%87%BA%EF%BC%8C%E5%A6%82%E4%BD%95%E8%AE%A9%E6%B6%88%E8%B4%B9%E8%80%85%E4%BF%9D%E6%8C%81%E6%B4%BB%E5%8A%9B.png)
假设我们有一个简单的管道:
a | b
比如说,a
退出 - 有没有一种可靠的方法可以b
在任意时间内保持活动状态(以完成任务等)。
答案1
b
不会因终止而a
终止。
$ { echo hello; } | { read message; printf 'got "%s"\n' "$message"; sleep 5; echo "ok, I'm done"; }
got "hello"
ok, I'm done
在这里,a
(echo hello
)将简单地输出一个字符串并终止。管道 ( ) 的右侧b
将读取字符串,输出它,休眠一段时间,然后echo
在终止之前执行最后的操作。
如果b
在终止时终止a
,它将永远没有时间做它需要做的事情。唯一的事情b
不能这里要做的是从标准输入中读取更多数据(read
最后的额外数据将立即获得文件结尾)。
在里面其他场景(问题中未提及),如果它尝试写入其标准输出(跨到不存在的进程)并从中终止(默认情况下),则b
终止之前将收到一个信号。a
a
PIPE
b
如果它没有尝试写入管道,a
将继续运行直到完成。