我有一个带有MPI的C代码应该在不同的目录中执行bash脚本,具体取决于mpi-rank。例如:如果我用mpirun -np 10运行它mycode.o它应该每个进程应该执行调用系统,其中s是从snprintf创建的字符串(s,sizeof(s),“/ home / myaccount / myscript .sh%d“,排名);
完整代码如下:
#include <stdio.h>
#include <mpi.h> /* MPI header file */
#include <stdlib.h>
void main(int argc, char *argv[])
{
int rank, size;
/* init into MPI */
MPI_Init(&argc, &argv);
/* my rank - my id */
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
/* how many processes in the virtual machine */
MPI_Comm_size(MPI_COMM_WORLD, &size);
/*create script input (convert rank to string)*/
char s[256];
snprintf(s, sizeof(s), "/home/myaccount/myscript.sh %d", rank);
/* run script */
system(s);
/* out of the virtual machine */
MPI_Finalize();
}
测试脚本是:
#!/bin/bash
for((k=16;k<22;k+=2));
do echo cd /otherdirectory/test/"$k"/"$1"/;
done;
exit;
当我使用mpirun -np 10运行时,应该给出:
cd / otherdirectory / test / 16/0 /
cd / otherdirectory / test / 16/9 /
cd / otherdirectory / test / 16/8 /
等等。但是返回
cd / otherdirectory / test / 16 / is_csh /
cd / otherdirectory / test / 18 / is_csh /
cd / otherdirectory / test / 20 / is_csh /
我无法弄清楚“is_csh”的来源。如果我使用printf(“%s \ n”)而不是系统,我会得到我上面所期望的。
有什么想法吗?
答案 0 :(得分:2)
在/ test /之后输出$k
。 $ k从16到20运行。所以这是你应该期待的。
我会假设您的主目录中有.bashrc,或者可能是/ etc / bashrc,它会破坏1美元,因此当您的脚本最终到达时,该参数会被其他内容覆盖。
或许您的系统shell是csh或tcsh或类似的东西,并且在登录后切换到bash。当您从命令行启动脚本时,bash直接执行它。但是system()调用将从/ etc / passwd获取shell并运行<shell> -c <args to system>
,因此启动时由csh执行的.login或.cshrc或类似文件也可能是罪魁祸首。