标签: fifo

从多个 fifo 并行读取非阻塞

有时我会坐在一堆并行运行的程序的输出先进先出。我想合并这些先进先出。天真的解决方案是:

cat fifo* > output
Run Code Online (Sandbox Code Playgroud)

但这需要第一个fifo在从第二个fifo读取第一个字节之前完成,这会阻塞并行运行的程序。

另一种方式是:

(cat fifo1 & cat fifo2 & ... ) > output
Run Code Online (Sandbox Code Playgroud)

但这可能会混合输出,从而在输出中得到半行。

当从多个fifos读取时,必须有一些合并文件的规则。通常逐行执行它对我来说就足够了,所以我正在寻找可以做的事情:

parallel_non_blocking_cat fifo* > output
Run Code Online (Sandbox Code Playgroud)

它将并行读取所有先进先出,并一次将输出与整行合并。

我可以看到编写该程序并不难。您需要做的就是:

  1. 打开所有先进先出
  2. 对所有这些进行阻塞选择
  3. 从具有数据的 fifo 中非阻塞地读取到该 fifo 的缓冲区中
  4. 如果缓冲区包含完整的行(或记录),则打印出该行
  5. 如果所有fifos都关闭/eof:退出
  6. 转到 2

所以我的问题不是:可以做到吗?

我的问题是:它已经完成了吗,我可以安装一个工具来做到这一点吗?

merge cat parallel-processing fifo

7
推荐指数
1
解决办法
1743
查看次数

多个 unix 管道不工作

第一个管道工作正常(打印“c”):

echo "a" | sed 's/a/b/' | sed 's/b/c/'
Run Code Online (Sandbox Code Playgroud)

这个不符合我的预期(当我将“a”输入到我的 fifo 中时没有打印任何内容):

mkfifo fifo;
cat fifo | sed 's/a/b/' | sed 's/b/c/' 
Run Code Online (Sandbox Code Playgroud)

但是,如果我从后一个管道中删除第二个“sed”命令,则会打印“b”。我认为我对管道和重定向的理解太简单了。有人可以向我解释如何解决第二种情况,以便我可以对 fifo 的内容运行两个连续的命令吗?

(请注意,这不是特定于 fifo 的问题,netcat 也会出现相同的行为。我发布了一个关于 netcat的类似问题,但没有得到答案)

unix netcat pipe fifo

7
推荐指数
1
解决办法
801
查看次数

不能 scp 命名管道

我正在尝试即时加密文件,将输出重定向到命名管道 [fifo]。我通过 SSH 连接到我的服务器并运行以下命令:

           $ mcrypt -k key < file > named_pipe
Run Code Online (Sandbox Code Playgroud)

然后从我的笔记本电脑我尝试 scp 它:

           $ scp me@server:~/dir/named_pipe 
Run Code Online (Sandbox Code Playgroud)

它说

           scp: /users/home/me/dir/named_pipe: not a regular file
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?谢谢

linux scp fifo

5
推荐指数
1
解决办法
2972
查看次数

FIFO(命名管道)保持“打开”状态多久?

例如,我有一个脚本将时间写入 /etc/pipe 中的管道。它在 while true 循环中连续写入。管道中的数据可以读取多长时间?如果我只决定在一天后使用 cat /etc/pipe 读取管道,我是否会从我开始写入时获得所有时间值?

相反,如果我的循环每 10 分钟只写一次时间会怎样。一天后我可以访问所有内容吗?

最后,假设我的循环连续写入时间(就像我的第一个示例一样),并且我每 30 分钟读取一次管道。如果我的计算机在我读取管道之前关闭,当我重新启动时管道是空的还是会保存所有数据?

linux unix pipe named-pipe fifo

5
推荐指数
1
解决办法
3808
查看次数

bash 可以从两个单独的命令中使用相同的 fifo 吗?

我有一个巨大的数据源,我正在使用一些greps 进行过滤。

这基本上是我现在正在做的事情:

#!/bin/bash
param1='something'
param2='another'
param3='yep'
echo $(avro-read /log/huge_data | grep $param1 | grep "$param2-" | grep $param3 | wc -l) / $(avro-read /log/ap/huge_data | grep $param1 | grep -v "$param2-" | grep $param3 | wc -l) | bc -l
Run Code Online (Sandbox Code Playgroud)

请注意我是如何进行两次基本相同的过滤(第二次只有一个差异),对每个进行计数,然后除以最终结果。这绝对是一件很麻烦的事情,但我想尝试加快一点速度,并且只执行一次初始过滤而不使用临时文件。

我尝试使用 fifo,但我不确定是否有可能在一个脚本中读取两个进程,以及是否有第三个进程“等待”,直到两个进程都完成以计算最终结果。我也研究过 using tee,但又不确定如何同步生成的子进程。

编辑:自己使用https://superuser.com/a/561248/43649解决了这个问题,但将另一个建议标记为答案。

bash grep fifo

5
推荐指数
1
解决办法
553
查看次数

如何防止终止命令以将 EOF 发送到命名管道?

我面临的问题正是这个:http : //www.linuxmisc.com/4-linux/d7863c256bccbfb6.htm

我希望能够运行一个接受 stdin 的程序,并在需要时向其中写入数据。我可以使用 fifo 命名管道来做到这一点。例如:

txtplay < named_pipe.fifo

echo "Hello World" > named_pipe.fifo

但是,这样做的缺点是第一个命令在第二个命令完成后退出。我想要的是相同的:

txtplay

实际上,这样我就可以随时保留我的数据,而不必担心它会看到文件结尾。不幸的是,我不能简单地这样做,因为我希望在程序看到数据之前通过过滤器处理发送给它的数据。

为什么每次我想向它发送数据时都不加载程序?太慢了。

基本上,我想要的是一种将给定命令的输出重定向到 fifo 命名管道的方法,而无需文件结尾。当我在做的时候,这个 EOF 业务是如何运作的?是不是有特殊的“EOF”命令,还是没有收到数据,或者原来输出数据的程序退出了?

有什么解决办法吗?

bash fifo

5
推荐指数
1
解决办法
6171
查看次数

标签 统计

fifo ×6

bash ×2

linux ×2

pipe ×2

unix ×2

cat ×1

grep ×1

merge ×1

named-pipe ×1

netcat ×1

parallel-processing ×1

scp ×1