虽然我的原始问题以不同的方式解决了(请参阅此问题下的评论主题,以及对此问题的编辑),但我能够在Bash中为GNU Parallel创建堆栈/ LIFO。因此,我将编辑我的背景/问题,以反映可能需要的情况。
我正在使用GNU Parallel来处理带有Bash脚本的文件。在处理文件时,会创建更多文件,并且需要将新命令添加到并行列表中。我无法并行完整的命令列表,因为在处理初始文件时会生成信息。
我需要一种方法在行动时将行添加到并行列表中。
如果队列中没有任何内容,并行还需要等待新行,并在队列完成后退出。
首先我创建了一个fifo:
mkfifo /tmp/fifo
接下来,我创建了一个bash文件,该文件包含文件并将输出管道并行,这将检查end_of_file行。 (我在接受的答案以及here)
的帮助下写了这篇文章#!/bin/bash
while true;
do
cat /tmp/fifo
done | parallel --ungroup --gnu --eof "end_of_file" "{}"
然后我用这个命令写入管道,在并行队列中添加行:
echo "command here" > /tmp/fifo
使用此设置,所有新命令都将添加到队列中。 队列满了并行将开始处理它。这意味着如果您有32个作业(32个处理器)的插槽,则需要添加32个作业才能启动队列。
如果并行占用了所有处理器,它将暂停工作直到处理器可用。
通过使用--ungroup
参数,parallel将在队列已满时将处理/输出作业添加到队列中。
如果没有--ungroup
参数,则并行等待直到完成作业需要新的插槽。从接受的答案:
运行或已完成作业的输出将被保留,并且仅在JobSlots启动了更多作业时打印(除非您使用--ungroup或-u,在这种情况下,作业的输出会立即打印)。例如。如果您有10个作业点,那么第一个已完成作业的输出将仅在作业11开始时打印,而第二个已完成作业的输出仅在作业12开始时打印。
答案 0 :(得分:3)
来自http://www.gnu.org/software/parallel/man.html#EXAMPLE:-GNU-Parallel-as-queue-system-batch-manager
使用GNU并行作为队列系统/批处理管理器时存在一个小问题:您必须先提交JobSlot数量的作业才能启动,之后您可以一次提交一个,如果有空,则立即开始工作插槽可用。正在运行或已完成作业的输出将被保留,并且仅在JobSlots启动了更多作业时打印(除非您使用--ungroup或-u,在这种情况下,作业的输出会立即打印)。例如。如果您有10个作业点,那么第一个已完成作业的输出将仅在作业11开始时打印,而第二个已完成作业的输出仅在作业12开始时打印。