我正在尝试自动化PBS脚本生成和qsub提交。我有N个文件夹,每个文件夹包含子文件夹。我想移动到每个文件夹和子文件夹,创建一个PBS脚本并从该文件夹提交PBS脚本。我写了一个perl脚本来做同样的运行。创建PBS脚本没有任何问题,但使用qsub提交时,作业无法执行。
有趣的是,我观察到如果我在文本编辑器中打开PBS脚本并保存它就会执行该作业(使用":wq"在vim中,如果我退出而不保存&#34则不起作用;:q")
我想知道为什么会这样,任何自动化解决方案?我知道有一些方法可以在不更改文件夹和子文件夹的情况下执行此操作 - 通过直接提供文件路径,但我试图了解这里出了什么问题。
#!/usr/bin/perl
use strict;
use warnings;
use File::Copy 'move';
use Cwd;
##################################################################
my @folders = ("folder1","folder2","folder3");
my $original_path = cwd();
my $queue_name = $ARGV[0];
##################################################################
# Call function for each folder in the list
foreach (@folders) {
submit_qsub($_);
}
##################################################################
# Function to change folders, call another function to make PBS script, submit PBS script using system command
sub submit_qsub {
my $folder = $_;
print "\nFunction for $folder called\n";
chdir ("./$folder" or die "Can't cd to $folder $!\n");
chdir ("./V1");
mkdir ("jobname");
chdir ("jobname");
create_pbs_script($folder,'V1','jobname');
system("qsub jobname_$folder\_V1.pbs");
chdir ("../../V2/");
mkdir ("jobname");
chdir ("jobname");
create_pbs_script($folder,'V2','jobname');
system("qsub jobname_$folder\_V2.pbs");
print "Leaving current directory\n";
chdir ($original_path);
}
##################################################################
# Function to write PBS scripts
# test - print numbers 1 to 100
sub create_pbs_script {
my $folder = $_[0];
my ($vid, $chdid) = split /_/, $folder;
my $v_no = $_[1];
my $job = $_[2];
my $filename = "$job\_$folder\_$v_no.pbs";
#print $filename;
open(my $fh, '>', "$job\_$folder\_$v_no.pbs") or die " Cannot write PBS script $job\_$folder\_$v_no\n";
print $fh "#PBS -N $job\_$folder\_$v_no\n#PBS -q $queue_name\n#PBS -l nodes=1:ppn=1\n#PBS -l walltime=00:10:00\n#PBS -l mem=1gb\n#PBS -j oe\n\ncd \$PBS_O_WORKDIR\n\nfor i in {1..100};do echo \$i;done";
close $fh;
}
##################################################################
更新:我在通过qsub提交之前插入了一个系统命令来打开并保存在vim中,并且执行了该作业。我有这个代码可以工作,但我仍然不知道为什么我需要这样做。
system("vim pbsfilename -c 'wq'");