使用bash脚本分发命令行

时间:2012-07-19 08:11:14

标签: bash process parallel-processing

我正在尝试实现简单的并行化,其中命令行分布在不同的进程中。为此我编写了这个名为jobsel的脚本:

(only "#! /bin/bash" and help message is omitted)

slots=$1
sel=$2

[[ $slots -gt 0 ]] || die_usage
[[ $sel -lt $slots ]] || die_usage

i=0
while read line
do
        (( i % slots == sel )) && eval $line
        i=$(( i + 1 ))
done

# in case the last line does not end with EOL
if [[ $line != "" ]]; then
        (( i % slots == sel )) && eval $line
        i=$(( i + 1 ))
fi

我放eval因为没有它我不能在命令中使用重定向或管道。

$HOME/util/jobsel 22 0 < cmds是一个包含cmds等行数越来越多的文件时,我在控制台模拟器上运行此echo 0 >> out时,会按预期输出0, 22, 44...在单独的行中。好到目前为止。

所以我把它付诸实践。但是当我通过安全shell运行它时,我通过at运行了背景(以&结束每一行)。然后有一个问题。当我输入8行时,开始了21个进程! ps -AFH打印具有相同命令和不同pID的进程。所有工作流程都直接在init下处于同一级别。我的程序无论如何都不会创建子进程。

困惑,我通过echo 0 >> out尝试了at脚本,然后输出包含重复的行。仍然难以置信,并且考虑同时追加可能导致异常,我使用其他方法确认某些行已多次运行。

此外,当所有内容都在终端中运行或者为每个工作进程创建单独的at作业时,没有这种异常。

但这怎么可能发生呢?我的脚本有问题吗? at/atd有一些错误吗?

1 个答案:

答案 0 :(得分:2)

GNU parallel正是您要实现的目标。

提示:它与xargs的结合很好