NQSでシンプルなコマンド列ファイルから実行する
NQSという並列ジョブ管理の仕組みがある。
ジョブを
#!/bin/bash commandX
のようなファイルを作り(command.shとか)
# qsub command.sh
(qsubコマンドのオプションは省いてある)
のようにジョブを発行すると、"commandX"というコマンドのジョブを適当に割り振ってくれるものである。
今、commandX1, commandX2,....,commandXk というk個のコマンドを発行したいとする。
k個の"xxxxx.sh"ファイルを作るのは面倒くさいので、
シンプルな
commandX1 commandX2 ... commandXk
というファイル"commandlist.txt"を作ってやり、このファイルを受け取ると、
先の"xxxxx.sh"のファイルを作った上で、"qsub xxxx.sh"というコマンドを発行してくれるようなスクリプト("qsubexe.pl")を作ってみた。
# perl ./qsubexe.pl commandlist.txt
commandXi の末尾には、"&"を書いた方が(なぜかわからないけれども)無難なようだ。
まだ確認していないのは、perlスクリプトに書かせた "xxxxx.sh"ファイルは、どの時点で消してもよいかである。
#! /usr/bin/perl -w =head1 header ########################################################### # # =cut use strict; &main(@ARGV); exit; =head1 main ########################################################### # # #main関数 # # \arg1 $input_file : format_fixed input file # コマンドが1行1コマンドで書かれているファイルを読み込み、 # コマンド数のqsubに渡すファイルを作成 # その上でコマンド数のqsubコマンドを発行する # =cut sub main(@){ my ($input_file)=@_; open (INPUT, "$input_file"); my @twodim; my $linecount=0; my $columncount=0; my @files; my $chmodcommand; my $command; while(<INPUT>){ $files[$linecount]="$input_file"."_"."$linecount"."\.sh"; open (OUT, ">$files[$linecount]"); print OUT "#!/bin/bash\n\n$_"; close OUT; $command = "qsub $files[$linecount]"; system($command); $linecount++; } close INPUT; }