有时我会坐在一堆并行运行的程序的输出先进先出。我想合并这些先进先出。天真的解决方案是:
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)
它将并行读取所有先进先出,并一次将输出与整行合并。
我可以看到编写该程序并不难。您需要做的就是:
所以我的问题不是:可以做到吗?
我的问题是:它已经完成了吗,我可以安装一个工具来做到这一点吗?
第一个管道工作正常(打印“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的类似问题,但没有得到答案)
我正在尝试即时加密文件,将输出重定向到命名管道 [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)
有没有办法做到这一点?谢谢
例如,我有一个脚本将时间写入 /etc/pipe 中的管道。它在 while true 循环中连续写入。管道中的数据可以读取多长时间?如果我只决定在一天后使用 cat /etc/pipe 读取管道,我是否会从我开始写入时获得所有时间值?
相反,如果我的循环每 10 分钟只写一次时间会怎样。一天后我可以访问所有内容吗?
最后,假设我的循环连续写入时间(就像我的第一个示例一样),并且我每 30 分钟读取一次管道。如果我的计算机在我读取管道之前关闭,当我重新启动时管道是空的还是会保存所有数据?
我有一个巨大的数据源,我正在使用一些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解决了这个问题,但将另一个建议标记为答案。
我面临的问题正是这个:http : //www.linuxmisc.com/4-linux/d7863c256bccbfb6.htm
我希望能够运行一个接受 stdin 的程序,并在需要时向其中写入数据。我可以使用 fifo 命名管道来做到这一点。例如:
txtplay < named_pipe.fifo
echo "Hello World" > named_pipe.fifo但是,这样做的缺点是第一个命令在第二个命令完成后退出。我想要的是相同的:
txtplay实际上,这样我就可以随时保留我的数据,而不必担心它会看到文件结尾。不幸的是,我不能简单地这样做,因为我希望在程序看到数据之前通过过滤器处理发送给它的数据。
为什么每次我想向它发送数据时都不加载程序?太慢了。
基本上,我想要的是一种将给定命令的输出重定向到 fifo 命名管道的方法,而无需文件结尾。当我在做的时候,这个 EOF 业务是如何运作的?是不是有特殊的“EOF”命令,还是没有收到数据,或者原来输出数据的程序退出了?
有什么解决办法吗?