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;
}