我现在有这样的情况:
inotifywait -m ./input -e close_write | parallel --max-args 1 "echo {1}"因为某种原因,这根本没什么用。inotifywait的输出与find相同(即每行一个文件):
find ./input -type f | parallel --max-args 1 "echo {1}"工作正常的...and。为什么它不适用于inotifywait?
发布于 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并行内部处理。这可能导致混合来自不同命令的输出,因此,只有在您不关心输出的情况下才应该使用。
因此,
inotifywait ./input -e close_write | parallel --ungroup --max-args=1 echo {1}发布于 2021-02-26 14:18:26
https://www.gnu.org/software/parallel/parallel.html#EXAMPLE:-GNU-Parallel-as-dir-processor基本上就是你所做的。
它指出:
使用GNU并行作为dir处理器与使用GNU并行作为队列系统/批处理管理器具有相同的限制。
在使用GNU并行作为队列系统/批处理管理器时,有一个小问题:您必须在作业开始之前提交JobSlot数量,然后可以一次提交一个作业,如果可用空闲插槽,作业将立即启动。运行中或已完成作业的输出将受到抑制,只有在启动了JobSlots更多作业时才会打印输出(除非您使用--ungroup或-line-缓冲区,在这种情况下,来自作业的输出将立即打印)。例如,如果您有10个作业槽,则第一个已完成作业的输出将仅在作业11启动时打印,而第二个已完成作业的输出仅在作业12启动时打印。
这就是你所看到的。
试试这个:
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>&1https://unix.stackexchange.com/questions/635717
复制相似问题