Parallel processing 如何编写while循环以在unixsh上运行并行进程?

Parallel processing 如何编写while循环以在unixsh上运行并行进程?,parallel-processing,sh,Parallel Processing,Sh,我有一个脚本文件,其中包含析因实验设计(DoE)的不同案例ID。我也有一个脚本文件在MATLAB上运行。我试图一次运行多个DoE案例,准确地说是25个,一次最多运行25个。ssh服务器的当前输入如下所示(批处理文件): InputFile=InputFile.txt 计数=0 而read-r情况;做 echo$case nohup matlab-nodisplay-nodesktop-r“try;runinput=$case;matlab_脚本;end;exit” ((++count%25==0

我有一个脚本文件,其中包含析因实验设计(DoE)的不同案例ID。我也有一个脚本文件在MATLAB上运行。我试图一次运行多个DoE案例,准确地说是25个,一次最多运行25个。ssh服务器的当前输入如下所示(批处理文件):

InputFile=InputFile.txt
计数=0
而read-r情况;做
echo$case
nohup matlab-nodisplay-nodesktop-r“try;runinput=$case;matlab_脚本;end;exit”
((++count%25==0))&等待(&W)

完成我看不到您的代码的
ssh
方面在哪里,我也不使用
Matlab
,但是如果您希望一次运行25个实例,我建议GNU Parallel,类似这样:

parallel --dry-run -j25 -a inputfile.txt matlab -nodisplay -nodesktop -r "try;runinput={};matlab_script;end;exit"

除了GNU并行,还有GNU xargs及其
-p
选项:

xargs -P25 -d'\n' -I{} -t matlab -nodisplay -nodesktop -r "try;runinput={};matlab_script;end;exit" < inputfile.txt

不幸的是,我无法在我的机器上访问并行命令。这是一个Perl脚本,任何人都可以在10秒钟内安装。。。我正在访问具有多个可用内核的远程服务器。我不拥有此服务器,因此我没有安装任何东西的权限。好了,您不需要在远程多核主机上安装GNU并行程序,就可以使用本地安装的GNU并行程序在本地计算机上运行作业。我认为唯一的要求是远程机器上存在Perl。也许@OleTange会证实这一点?或者你可以很容易地尝试一下。那么我的批处理文件会是什么样子呢?我是运行您发布的第一个命令还是第二个示例?对于这两个示例,另一个问题是,使用top时会产生25个不同的作业吗?还是将其视为单个作业?
是否运行您发布的第一个命令或第二个示例?
一个或另一个。很抱歉,但没有什么能阻止你理解它。阅读
xargs
文档以了解其选项并学习基本的bash脚本-研究如何在bash中逐行读取文件,如何在后台运行进程以及如何等待进程<代码>使用top时会产生25个不同的作业吗?
这些进程在后台运行。将有26个进程——25个运行matlab,一个运行shell或xargs。研究什么是进程与线程。
我的批处理文件看起来像什么?
脚本是用bash shell编写的。A表示非交互式执行-我不知道matlab是否读取输入,其目的是实现非交互式执行。另外,调用了
.BAT
windows cmd脚本-我没有windows cmd方面的经验,这不是
.BAT
脚本。对于第二个脚本:如果已经有25个进程从另一个类似的脚本运行,这是否意味着它不会运行任何进程?出于某种原因,我让其中两个命令同时运行,使用不同的matlab脚本。其中一个已在运行,限制为5个文件,另一个已运行,限制为6个文件。这导致此时只有一个新批处理命令进程在运行,而其他5个进程仍在从旧批处理脚本运行。
xargs -P25 -d'\n' -I{} -t matlab -nodisplay -nodesktop -r "try;runinput={};matlab_script;end;exit" < inputfile.txt
count=0
while IFS= read -r case; do
    echo $case
    matlab -nodisplay -nodesktop -r "try;runinput=$case;matlab_script;end;exit" &
    if ((++count % 25 == 0)); then 
          if ! wait -n; then
               echo "ERROR - matlab failed!"
          fi
    fi
done <"$InputFile"
wait