2015-05-27 378 views
1

我有两个工作,jobA.sh和jobB.sh. jobA.sh成功完成后,我想让jobB.sh启动。为此,我必须获得jobA.sh的jobid编号。但是我的代码的以下部分是有问题的。我的代码给出了以下错误。该错误意味着jobB.sh无法启动。该代码无法获得jobA.sh的jobid号码。我如何获得jobA.sh的工作号码?如何使用perl脚本获取在slurm上提交的作业的jobid编号?

错误:

Submitted batch job 298784 sbatch: error: Batch job submission failed: Job dependency problem

代码正确提交jobA.sh但它提供了上述错误的jobB.sh.

my $jobidA=0; 
my $jobs = "sbatch jobA.sh"; 
system $jobs || die "Error:\n$jobs\nerror"; 
# I think the following line captures jobid? 
($jobs =~ /^Submitted batch job (\d+)/); 
# And the following line stores jobid? 
my $jobidA = $1; 

my $jobs2 = "$path/jobB.sh"; 
my $jobs2 = "sbatch --dependency=afterok:$jobidA $jobB.sh"; 
system $jobs2 || die "Error:\n$jobs2\nerror"; 

回答

1

如果要捕获sbatch命令的输出,则不能使用系统,但必须使用反引号来捕获输出。使用(未经测试的代码):

my $jobidA=0; 
my $jobs = "sbatch jobA.sh"; 
my $output = `$jobs` 
($jobs =~ /^Submitted batch job (\d+)/); 

$jobidA = $1; 

my $jobs2 = "$path/jobB.sh"; 
$jobs2 = "sbatch --dependency=afterok:$jobidA $jobB.sh"; 
system $jobs2 || die "Error:\n$jobs2\nerror"; 
1

我单独测试了以下代码部分。他们都还好。你可以使用它们。

如果jobB依赖于jobA,则可以将以下部分添加到代码中。它已经过测试。

my $jobid1 = 0; 
my $jobs = `sbatch jobA.sh`; 
$jobs =~ /^Submitted batch job (\d+)/; 
$jobid1 = $1; 

my $jobs2 = "$path/jobB.sh"; 
my $jobs2 = "sbatch --dependency=afterok:$jobid1 $jobB.sh"; 
system $jobs2 || die "Error:\n$jobs2\nerror"; 

以下示例有三个依赖于以前提交的作业的作业。这也经过了测试。

my $jobid1 = 0; 
my $jobs = `sbatch jobA.sh`; 
$jobs =~ /^Submitted batch job (\d+)/; 
$jobid1 = $1; 

my $jobs2 = "$path/jobB.sh"; 
my $jobs2 = `sbatch --dependency=afterok:$jobid1 $jobB.sh`; 
$jobs =~ /^Submitted batch job (\d+)/; 
$jobid2 = $1; 

my $jobs3 = "$path/jobC.sh"; 
my $jobs3 = "sbatch --dependency=afterok:$jobid2 $jobC.sh"; 
system $jobs3 || die "Error:\n$jobs3\nerror"; 
相关问题