0

我正在尝试实现简单的并行化,其中命令行分布在不同的进程中。为此,我编写了这个我命名的脚本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有什么bug吗?

4

1 回答 1

2

GNU并行是您尝试实现的。

提示:与 xargs 结合使用效果很好

于 2012-07-19T09:10:16.883 回答