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