首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何与inotifywait并行使用?

如何与inotifywait并行使用?
EN

Unix & Linux用户
提问于 2021-02-21 23:35:10
回答 2查看 384关注 0票数 2

我现在有这样的情况:

代码语言:javascript
复制
inotifywait -m ./input -e close_write | parallel --max-args 1 "echo {1}"

因为某种原因,这根本没什么用。inotifywait的输出与find相同(即每行一个文件):

代码语言:javascript
复制
find ./input -type f | parallel --max-args 1 "echo {1}"

工作正常的...and。为什么它不适用于inotifywait

EN

回答 2

Unix & Linux用户

发布于 2021-02-24 23:31:05

原因隐藏在此语句中,不受文档(man parallel)影响。

GNU并行确保命令的输出与按顺序运行命令时得到的输出相同。这使得使用GNU并行输出作为其他程序的输入成为可能。

继续阅读,你会发现

--group组输出。每个作业的输出都分组在一起,只有在命令完成后才会打印出来。标准错误(标准错误)之后是stdout (标准输出)。...如果可以接受来自不同命令的输出混合在一起,那么禁用与-u的分组可以加速GNU并行... --group是默认的。可以用-u逆转

在您的情况下,由于inotifywait -m不退出,parallel将永远收集其输出。当inotifywait -m完成时(它从来没有完成),parallel就会输出它处理过的所有数据。

您可以使用--ungroup (-u)标志“修复”此问题。

--ungroup \ -u取消组输出。输出尽快打印,并通过GNU并行内部处理。这可能导致混合来自不同命令的输出,因此,只有在您不关心输出的情况下才应该使用。

因此,

代码语言:javascript
复制
inotifywait ./input -e close_write | parallel --ungroup --max-args=1 echo {1}
票数 1
EN

Unix & Linux用户

发布于 2021-02-26 14:18:26

https://www.gnu.org/software/parallel/parallel.html#EXAMPLE:-GNU-Parallel-as-dir-processor基本上就是你所做的。

它指出:

使用GNU并行作为dir处理器与使用GNU并行作为队列系统/批处理管理器具有相同的限制。

https://www.gnu.org/software/parallel/parallel.html#EXAMPLE:-GNU-Parallel-as-queue-system-batch-manager说:

在使用GNU并行作为队列系统/批处理管理器时,有一个小问题:您必须在作业开始之前提交JobSlot数量,然后可以一次提交一个作业,如果可用空闲插槽,作业将立即启动。运行中或已完成作业的输出将受到抑制,只有在启动了JobSlots更多作业时才会打印输出(除非您使用--ungroup或-line-缓冲区,在这种情况下,来自作业的输出将立即打印)。例如,如果您有10个作业槽,则第一个已完成作业的输出将仅在作业11启动时打印,而第二个已完成作业的输出仅在作业12启动时打印。

这就是你所看到的。

试试这个:

代码语言:javascript
复制
seq 100 | parallel --delay 1 -j1 echo | # give 1..100 one per second
  # stdout is cached by GNU Parallel, >&3 is not
  parallel -j4 'sleep 1; echo stdout {}; echo direct {} >&3; sleep 1' 3>&1
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/635717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档