wait -nの代替(サーバーに古いバージョンのbashがあるため)

wait -nの代替(サーバーに古いバージョンのbashがあるため)

特定のノードに並列化されたジョブの送信に関する以下の問題を解決したいと思います。


まず、質問の構造を説明します。

2つの非常に単純なMatlabスクリプトがあります

1) メイン.M

clear
rng default
P=2;
grid=randn(4,3);
jobs=1;

2) FM

sgetasknum_grid=grid(jobs*(str2double(getenv('SGE_TASK_ID'))-1)+1: str2double(getenv('SGE_TASK_ID'))*jobs,:); %jobsx3

result=sgetasknum_grid+1; 

filename = sprintf('result.%d.mat', ID);
save(filename, 'result')

exit

私がしたいことは:

  • main.mを実行してください。

  • それではFMを実行してみてください4番、並列実行可能毎回2つの作業

  • すべてがノードで実行する必要があります。


上記の手順を実装した方法は次のとおりです。

1)私はというフォルダにmain.m保存しました。f.mMy_folder

2)td.sh以下のようにスクリプトを作成してフォルダに保存しました。My_folder

#!/bin/bash -l
#$ -S /bin/bash
#$ -l h_vmem=5G
#$ -l tmem=5G
#$ -l h_rt=480:0:0
#$ -cwd
#$ -j y


#$ -N try

date
hostname

J=4 #number tasks

N=2 #number tasks executed in parallel

export SGE_TASK_ID


SGE_TASK_ID=1
n=0
while [ "$SGE_TASK_ID" -le "$J" ]; do
    if [ "$n" -eq "$N" ]; then
        wait -n  # as soon as one task is done, refill it with another
        n=$(( n - 1 ))
    fi

    printf 'Task ID is %d\n' "$SGE_TASK_ID"

    /share/.../matlab -nodisplay -nodesktop -nojvm -nosplash -r "main; ID=$SGE_TASK_ID; f; exit" &

    SGE_TASK_ID=$(( SGE_TASK_ID + 1 ))
    n=$(( n + 1 ))
done

wait

三)ターミナルに行きssh username@A、、、cd /.../My_folder次のように入力します。bash td.sh


質問:次のエラーが発生します。

td.sh: line 26: wait: -n: invalid option
wait: usage: wait [id]

以下の説明からわかるように、問題は@Aのbashバージョンが古く(4.3のwait組み込みに-nオプションが追加されている)、システム管理者がそれを更新できないことです。最新バージョンはおそらくbash 4.1でしょう。

それでは、代替案を提案できますかwait -n

ベストアンサー1

作成したスクリプトは、gnuパラレルを使用するか、-jオプションを使用して実行する方が良いかもしれません。あるいは、Python(または他の言語)で書き換えることもできます。

見ている

  • parallel:bashで使用するためのツールです(3つのうち最も学びやすく、1つのことしかできません)。
  • make:もう少し進化して、自分だけの言語があります。ファイルを生成するために使用されます。たとえば、A.b必要なものを入手するには、A.ag.fのようにしますz;y;zA.a合計を計算する方法のルールを追加することもできますg.f。何が依存しているのかを把握し、正しい順序で構築します。可能であれば(要求された場合)、タスクを並列に実行します。
  • python:スクリプトが目的のタスクを実行するプログラミング言語で、MATLABが実行するタスクを実行します。

また、何がインストールされているのか、インストールできるのかを考慮する必要があります。これにより、次のことがわかります。

type parallel
type make
type python

注:typeこれは入力手順ではありません。入力した命令です。各コマンドのタイプ(位置)を通知します。

おすすめ記事