2012-07-06 52 views
1

我有使用使用在一个bash脚本循环变量来传递不同的命令行参数

int main(int argc, char *argv[]){ 
    double a,b; 
    a = atof(argv[1]); 
    b = atof(argv[2]); 
    further code..... 

我上运行的代码C++程序,其余传递两个兼作从命令行输入使用qsub实用性和我有一个名为“bash脚本jobsub.sh`提交它看起来像这样

#!/bin/csh -f  
hostname       
cd /home/roy/codes/3D    # change directory first -- replace Mysubdir 
set startdir = `pwd`    # remember the directory we're in 
if(! -d /scratch/$USER) then 
    mkdir /scratch/$USER  # create scratch directory 
endif        # if it does not exist 
#cp infile12 /scratch/$USER  # copy input file to scratch directory 
cd /scratch/$USER     # change to scratch directory 
#rm *.* 
$HOME/codes/3D/autoA100.out 2.1 2.2   # run a program 
cp * $startdir   # copy outputfiles back to where we started 

在我做终端的作业集群

但是,我想在不同的内核上并行运行ab不同值的同一个可执行文件。是否有可能写在bash脚本循环,这样我可以做 类似,

for i=1;i<=10;i++ { 
    $HOME/codes/3D/autoA100.out 2+i*0.1 2+i*0.2 
} 
+0

您的“bash”脚本类似于bash,但包含许多语法错误。 – jordanm 2012-07-06 01:21:20

+0

@jordanm:在某些方面,它看起来像csh(例如'set')。 – 2012-07-06 02:05:05

+0

@DennisWilliamson:是的,它看起来像csh – 2012-07-06 05:56:06

回答

0

您可以随时在后台运行的作业(在这种情况下,外壳将继续执行下一条指令)

MY_PIDS= 
for i in 1 2 3 4 5 6 7 8 9 10 
do 
    yourjob "$(a i)" "$(b i)" & # Note the ampersand (background) 
    MY_PIDS="$MY_PIDS "$!   # Do not write the $! inside the quotes, bash will 
            # break (better, don't use bash but plain sh) 
done 

# Wait wor each job to complete and cleanup 
for p in $MY_PIDS 
do 
    wait "$p" 
    echo "Return code of job $p is $?" 
    do_cleanup_for "$p" 
done 

但可以肯定,你需要确保在并行运行的作业不会踩着对方的脚(如写入同一文件)。

+0

引用$!在交互式shell中只是一个问题。 – jordanm 2012-07-06 01:35:11

+0

足够的问题,不要在上面引用它,我会说。 – 2012-07-06 01:37:23

+0

是否有你使用字符串来存储pids而不是数组的原因? – jordanm 2012-07-06 01:43:26

3

如果您提交的执行脚本批量加载器,那么有没有办法有像你想要的,因为整个脚本每个节点运行一个简单的循环做执行。但是,大多数批量加载器为用户提供了环境变量。

例如,PBS有$PBS_ARRAYID,它指定作业运行时的唯一ID。因此,而不是使用一个循环,你的脚本可以有:

a=$(echo "2+($PBS_ARRAYID+1)*0.1" | bc -l) 
b=$(echo "2+($PBS_ARRAYID+1)*0.2" | bc -l) 
$HOME/codes/3D/autoA100.out $a $b 

通知我添加1$PBS_ARRAYID以上,因为ID从0开始,而你的循环从1开始。还值得一提的是,尽管bash可以在本地进行一些算术运算,但它无法处理实数;这就是为什么我必须调用bc

+0

它可以处理一些实数,整数。它不能做浮点数学。 – jordanm 2012-07-06 01:30:11

+0

@chrisaycock抱歉复活这个旧帖子,但从来没有一个公认的解决方案;你说:“没有办法像你想要的那样用简单的循环执行执行,因为整个脚本都在每个节点上运行。”这是如何解决使用两个脚本,一个用于循环,一个用于qsub? – 2013-08-25 05:29:46

相关问题