繁体   English   中英

使用bash脚本分发命令行

[英]Distributing lines of commands using bash script

我正在尝试实现简单的并行化,其中命令行分布在不同的进程中。 为此我写了这个脚本,我命名为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和更多数字的行的文件时,它会按预期输出$HOME/util/jobsel 22 0 < cmds 0, 22, 44...在单独的行。 目前很好。

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

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

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

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

GNU parallel是你想要实现的。

提示:它与xargs结合得非常好

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM