首页 > 解决方案 > 哪个作业在哪个节点上运行?

问题描述

这是一个经常出现并挑战我的 AWK 技能的快速问题。如何列出集群上的所有作业以及分配给它们的节点列表。

就像是:

 JobId          Job Name    State      Hosts
               . . .
 29428   _2.0_cont_7.job        R      fm3/6
 29429   _2.2_cont_7.job        R      fm3/6
 29430   _2.4_cont_8.job        R      fm1/6
 29431   _2.6_cont_8.job        R      fm1/6
 29835           taverna        R   mathserv/40
               . . .

sinfo是否有一个参数qstat可以提供类似的输出而不需要进一步处理?或者什么是好的perlawk单线来完成这项工作?

这是我目前运行的

qstat -f | awk \
   '/Job Id/ {job=$3 ; 
        if (s > 0) {printf("%6s\t%16s\t%5s\t%8s\n",job,name,state,host); } s+=1} 
   /exec_host/ {host=$3} 
   /Job_Name/ {name=$3} 
   /job_state/ {state = $3} 
   END {printf("%6s\t%16s\t%5s\t%8s\n",job,name,state,host)}
   BEGIN {printf("%6s\t%16s\t%5s\t%8s\n","JobId","Job Name","State","Hosts")}'

更新

这是qstat -f输出的片段:

Job Id: 29835
    Job_Name = taverna
    Job_Owner = meos@taverna
    interactive = True
    job_state = R
    queue = all
    qtime = Wed Apr 10 12:02:10 2019
    mtime = Wed Apr 10 12:02:10 2019
    ctime = Wed Apr 10 18:02:10 2019
    exec_host = mathserv/40
    Priority = 4294873206
    euser = meos(1006)
    egroup = meos(1000)
    Resource_List.walltime = 06:00:00
    Resource_List.nodect = 1
    Resource_List.ncpus = 40

为集群上运行的每个作业打印此类块。

这里的exec_host参数标识节点和该节点上的槽数或具有为作业分配的相应槽数的至少一个节点。其余参数是不言自明的。

仅此块的预期输出将是

 JobId          Job Name    State      Hosts
 29835           taverna        R   mathserv/40

更新 2

对于任何感兴趣的人,更新原始 AWK 程序以修复一些错误并改进格式。它恰好也适用于 Torque 和 PBS 托管集群。

qstat -f | awk '/Job Id/ {job=$3 ; 
        if (s > 0) {printf(format,lastjob,user,name,state,host)} ;
        lastjob=job ; s+=1} 
   /exec_host/ {host=$3} 
   /Job_Name/ {name=$3} 
   /job_state/ {state = $3} 
   /Job_Owner/ {user=$3; sub("@.*","",user)}
   END {printf(format,lastjob,user,name,state,host)}
   BEGIN {format="%10s\t%10s\t%25s\t%5s\t%8s\n";
          printf(format,"JobId","Owner","Job Name","State","Hosts")}'

标签: perlawkslurm

解决方案


如果qstat手册页上没有您喜欢的内容,请像您一样解析输出。

这是 Perl

qstat -f | perl -wne'
    /Job Id:\s+(.*)/                              && push(@r, [$1])   or 
    /(?:Job_Name|job_state|exec_host)\s+=\s+(.*)/ && push(@{$r[-1]}, $1) 
    }{ 
    printf("%6s\t%16s\t%5s\t%8s\n", ("JobId", "Job Name", "State", "Hosts")
    printf("%6s\t%16s\t%5s\t%8s\n", @$_) for @r'

我在哪里复制你的输出格式。}{语法标记块的开始END

Job Id行在我们的结果数组中开始了一个新的 arrayref,@rID 是它的第一个元素。其他所需字段按出现顺序添加到@r.


推荐阅读