这里有一个快速的问题,经常出现并挑战我的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是否有一个参数可以提供类似的输出而无需进一步处理?或者什么是一个好的perl或awk单线来做这项工作?
以下是我目前运行的
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程序,以修复一些错误和改进格式。它恰巧在扭矩和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")}'发布于 2019-04-10 15:54:55
您可以直接为其中的大多数设置squeue输出格式。AFAICT,它不分别为每个节点提供CPU使用情况,不过:
squeue -t R --format="%.20i %.20j %.5t %.5C %R"
示例输出:
JOBID NAME ST CPUS NODELIST(REASON)
18206767 job_TR1_11_run007188 R 1 node05
18206768 job_TR2_11_run007188 R 1 node13
18207078 job_T1_11_run007188_ R 1 node24
18207079 job_T2_11_run007188_ R 1 node14
18207080 job_T3_11_run007188_ R 1 node17有关详细信息,请参阅man squeue或https://slurm.schedmd.com/squeue.html。
发布于 2019-04-10 08:02:01
如果在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行在结果@r数组中启动一个新的数组,ID是它的第一个元素。其他想要的字段按外观顺序添加到@r中的最后(所以当前)数组中。
发布于 2019-04-10 08:28:14
由于您的输入和输出顺序相同,因此可以在没有结束块的情况下完成该操作。宽度为0会触发换行符。
qstat -f | perl -nle'
BEGIN {
@fields=("Job Id",qw( Job_Name job_state exec_host ));
@width{@fields}=(6,20,9,0);
$"="|"; $re=qr/^\s*(@fields)\s*[:=]\s*(.*\S)/;
printf "%$width{$_}s\t",$_ for @fields; print "";
}
printf "%$width{$1}s\t%s", $2, $width{$1}?"":"\n" if /$re/
'https://stackoverflow.com/questions/55604021
复制相似问题