我们知道squeue
会返回正在运行的作业的状态。
squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
130 debug run.sh user PD 0:00 1 (Resources)
131 debug run.sh user PD 0:00 1 (Resources)
128 debug 52546914 user R 7:28 1 node1
129 debug run.sh user R 0:02 1 node1
例如我的核心号是2.
[问] 有没有办法只返回未使用的核心号码?在该示例中,未使用的核心编号应返回0.
我应该为此编写一个解析器,以便检索每个R
旁边的核心编号,添加它们,然后从总核心编号中减去它,如下所示:
squeue | grep -P ' R ' | awk '{print $7}' | paste -sd+ - | bc
答案 0 :(得分:2)
要了解群集中可用的核心(CPU)的数量,您可以使用sinfo
命令:
$ sinfo -o%C
CPUS(A/I/O/T)
0/1920/0/1920
您可以使用
轻松地将数字检索到Bash变量中IFS=/ read A I O T <<<$(sinfo -h -o%C)
运行上述命令后,A
将包含已分配核心的数量,I
将是空闲核心数量,O
将包含其他&#39;其他& #39;核心,即排水,下降等,T
将是系统中的核心总数。
请注意,在您的问题中,您谈论的是核心,但实际上计算了节点的数量。如果你想要的是节点数,你可以使用:
$ sinfo -o%A
NODES(A/I)
0/80
有关详细信息,请参阅sinfo man page。
答案 1 :(得分:1)
Python解决方案,此代码将一直处于休眠状态,直到有空闲核心启动:
import os
def slurmPendingJobCheck(): #{
totalCore = os.popen('sinfo | awk \'{print $4}\' | tail -n +2 | paste -sd+ - | bc').read().rstrip('\n');
usedCoreNum = os.popen('squeue | grep -P \' R \' | awk \'{print $7}\' | paste -sd+ - | bc').read().rstrip('\n');
if usedCoreNum == '':
usedCoreNum = 0;
while True: #{
if int(totalCore) - int(usedCoreNum) > 0: # Here we obtain unused code number.
log('There is ' + usedCoreNum + ' used core out of ' + totalCore + '.', 'green')
break;
log('Waiting running jobs to be completed.', 'blue')
time.sleep(10);
usedCoreNum = os.popen('squeue | grep -P \' R \' | awk \'{print $7}\' | paste -sd+ - | bc').read().rstrip('\n');
#}
#}