2012-07-19 139 views
0

我试图实现简单的并行化,其中命令行分布在不同的进程中。为此目的,我写这个剧本,我命名为jobsel使用bash脚本分配命令行

(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打印过程。所有的工作流程都在同一级别,直接在初始阶段。无论如何,我的程序不会创建子进程。

困惑,我试着echo 0 >> out脚本通过at然后输出包含重复的行。仍然很难相信,并认为同时追加可能会导致异常,我用其他方法来确认某些行多次运行。

此外,还有当一切都在终端已运行没有这样的异常或当我创建的每个工作进程独立at工作。

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

+0

而不是'[$((I%插槽))当量$ SEL]''做((I%插槽== SEL))'。请参见[流程管理](http://mywiki.wooledge.org/ProcessManagement)和[BashFAQ/050](http://mywiki.wooledge.org/BashFAQ/050)。 – 2012-07-19 08:17:38

+2

你有没有考虑过使用[GNU parallel](http://www.gnu.org/software/parallel/)? – 2012-07-19 08:44:20

+0

@DennisWilliamson谢谢。我正在申请编辑。 – h2kyeong 2012-07-19 09:05:15

回答

2

GNU parallel是你正在努力实现的。

提示:它的伟大工程结合起来xargs的