设置:我有一个 bash 系统,其中有一个从后台进程管道中生成的文件。在管道的第一阶段,有多个进程写入单个命名管道。在管道的下一阶段,有一个读取器进程,它读取命名管道并将数据传递给其他工作进程以对数据进行操作。(参见下面的示例脚本)。如果通过 https 与远程资源通信确定数据尚未准备好,这些工作人员可以将数据返回到 stage2 管道。
问题:该设置在不平凡的负载下工作得很好,直到我在管道第二阶段的工作进程内添加了 ssh 调用。一旦我这样做了,通过命名管道的大量数据就开始消失。即使我将负载显着减少到只有之前工作负载的 2%,也会发生这种情况。
我做了一些阅读,发现了一些关于 ssh 客户端销毁 fds 的模糊引用,所以我不确定这是否相关。
环境:我目前在 Ubuntu 20.04 上使用 bash 5.0.17。我还在 Ubuntu 22.04 系统上进行了测试,并看到了相同的行为。
简化的脚本
#!/bin/bash
function stage1_worker()
{
# Do work including network calls via a 3rd party program which uses python
flock --exclusive $QUEUE -c "print \"%s\n\" $DATA > $QUEUE"
}
function stage2_reader_v1()
{
local QUEUE_DATA=""
while true ;
do
# logic
if read QUEUE_DATA ; then
stage2_worker $QUEUE_DATA &
fi
# logic
done < $QUEUE
} …Run Code Online (Sandbox Code Playgroud)