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