############################################################################### # # 指定したノードのディレクトリ上の入力データを用いて PBS ジョブを実行し、 # その結果を自動的に元のディレクトリに移動する。 # # PBSジョブが実行したノードによらず、指定したノードのディレクトリ上に # 入力・出力ファイルが集約される。 # # RNODE --- 入出力ファイルを集約するノード。(default="fep") # default以外にも、任意のクラスターの親ノードを指定してよい。 # # RDIR --- 入出力ファイルを集約する $RNODE 上のディレクトリ。 # (default: ジョブを投入したディレクトリ) # # RFILE --- RDIR 上のジョブ実行に必要な入力ファイル一式。実行時にこれらを # 作業用ディレクトリ WDIR にコピーする。(default: RDIR 上のファイルすべて) # 【例】 RFILE="xxx.inp *.dat work/*" # # WDIR --- 実行先のノードに作られる作業用ディレクトリ。 # (default: $HOME/$$、1ノード内で閉じたジョブでは、/work/(USER)/$$ もよい。) # # SAVE = logical (0/1). # 0 --- 移動先の $WDIR を実行終了後に消去する(推奨, default)。 # 1 --- 消去せずに残す。 # ############################################################################### # # 以下、インデントのない行が、ユーザーが指定するところである。 # ############################################################################### #!/bin/bash #PBS -N calnos #PBS -l select=1:ncpus=16:mpiprocs=16:ompthreads=1 #PBS -j oe ###### ユーザー指定の変数の default 以外を設定する。########################### RNODE=date00 RDIR=/home/morita/calnos/Examples/test RFILE="nfinput work/*" WDIR= SAVE= echo -n 'START: '; date ###### initialization ##################################################### ###### [1] mpd ###### touch /tmp/node_$$ trap 'rm /tmp/node_$$' 1 2 3 15 uniq $PBS_NODEFILE > /tmp/node_$$ NPROCS=`cat $PBS_NODEFILE | wc -l` NHOSTS=`cat /tmp/node_$$ | wc -l` for i in `cat /tmp/node_$$` do rsh $i mpdcleanup >/dev/null done mpdboot -f /tmp/node_$$ -n $NHOSTS -r rsh EXIST=`rsh $RNODE "test -e $RDIR; echo \\$?"` # $RNODE:$RDIR の存在を確認する。 if [ $EXIST != 0 ]; then echo ' Error! No such a dirctory. Confirm RNODE and RDIR. '$RNODE":"$RDIR exit fi ###### [2] files ###### echo 'RNODE: '${RNODE:='fep'} # default は、'fep'になる。 echo 'RDIR: '${RDIR:=$PBS_O_WORKDIR} # defalut は、サブミットした場所。 echo 'RFILE: '${RFILE:="*"} # default は、すべて。 echo 'WDIR: '${WDIR:=$HOME/$$} # default は、$HOME/$$ echo 'SAVE: '${SAVE:=0} # default は、0 echo 'PBS_NODE: '`cat /tmp/node_$$` test -e $WDIR || mkdir -p $WDIR # WDIR をつくる。 cd $WDIR touch touch_$$ if [ "`rsh $RNODE ls $RDIR/touch_$$ 2>/dev/null`" == "$RDIR/touch_$$" ]; then IDENTICAL=0 # RDIR と WDIR が同一のとき、何もしない。 else IDENTICAL=1 # RDIR と WDIR が別ディレクトリのとき、RNODE の入力ファイルを WDIR にコピー。 rsh $RNODE "cd $RDIR; tar czf - $RFILE" | tar xzf - fi rm touch_$$ ####### execution ########################################################### export CALNOS='/home/morita/calnos' export DIRDATA=$CALNOS/Datafile mpiexec -machinefile $PBS_NODEFILE -n $NPROCS $CALNOS/md.x > out ############################################################################### ####### termination ####################################################### ###### [2] files ###### cd if [ $IDENTICAL -ne 0 ]; then # RDIR と WDIR が別ディレクトリのとき、WDIR の出力ファイルを RDIR にコピー。 # rsync -azu -e rsh $WDIR"/" $RNODE:$RDIR ionice -c 3 nice -n 10 rsync -azu -e rsh --rsync-path="ionice -c 3 nice -n 10 rsync" $WDIR"/" $RNODE:$RDIR if [ $? -eq 0 ]; then [ $SAVE -eq 0 ] && rm -rf $WDIR # SAVE=0 のとき、WDIR を削除。 else echo "rsync failed in terminating the job." fi fi ###### [1] mpd ###### mpdid=`mpdtrace -l` mpdexit $mpdid mpdcleanup -r rsh -f /tmp/node_$$ rm /tmp/node_$$ ########################################################################### echo -n 'END: '; date