Mon*_*and 8 command-line slurm
我已经在 Slurm 上提交了 800 个工作。我想取消那些作业 ID/编号大于数字的作业(因为它们有错误)。我不想取消我所有的作业,因为有些正在运行,有些在队列中是正确的。
小智 11
它不是严格回答如何取消大于给定数字的作业,但它可以解决@mona-jalilvand 试图解决的问题:取消此处描述的范围内的作业
scancel {1000..1050}
Run Code Online (Sandbox Code Playgroud)
比进入 bash 脚本要简单得多……对我来说效果很好。
您需要使用squeue
获取属于您的所有作业的列表,然后循环该列表并取消与您的条件匹配的每个作业(作业 ID 大于 X)scancel
。
squeue
有非常灵活的输出选项,通过它的-o
又名--format
选项,您可以告诉它准确打印您想要的内容。在本例中,我们只需要工作编号。根据,格式字符串man squeue
为:%i
%i作业或作业步骤 ID。
对于作业数组,作业 ID 格式将采用“_”形式。默认情况下,作业数组索引字段大小将限制为 64 字节。使用环境变量 SLURM_BITSTR_LEN 指定更大的字段大小。(对作业和作业步骤有效)在异构作业分配的情况下,作业 ID 格式将采用“#+#”形式,其中第一个数字是“异构作业领导者”,第二个数字是“异构作业领导者”,第二个数字是零源偏移量。工作的每个组成部分。
以下 sh 脚本使用它:
#!/bin/sh
if [ -z "$1" ] ; then
echo "Minimum Job Number argument is required. Run as '$0 jobnum'"
exit 1
fi
minjobnum="$1"
myself="$(id -u -n)"
for j in $(squeue --user="$myself" --noheader --format='%i') ; do
if [ "$j" -gt "$minjobnum" ] ; then
scancel "$j"
fi
done
Run Code Online (Sandbox Code Playgroud)
将其另存为,例如,cancel-jobs.sh
使用 使其可执行chmod +x cancel-jobs.sh
,然后运行它以./cancel-jobs.sh 50000
取消作业 ID 大于 50,000 的所有作业。
如果您希望取消大于或等于最小作业编号的作业编号,请将 更改-gt
为-ge
。
一个小的优化是不单独取消每个作业,而是建立一个匹配作业编号的列表,然后通过一次调用将它们全部取消scancel
。
例如,使用 bash 数组来保存作业编号:
#!/bin/bash
declare -a jobs=()
if [ -z "$1" ] ; then
echo "Minimum Job Number argument is required. Run as '$0 jobnum'"
exit 1
fi
minjobnum="$1"
myself="$(id -u -n)"
for j in $(squeue --user="$myself" --noheader --format='%i') ; do
if [ "$j" -gt "$minjobnum" ] ; then
jobs+=($j)
fi
done
scancel "${jobs[@]}"
Run Code Online (Sandbox Code Playgroud)
这与第一个脚本执行相同的操作,但效率稍高一些。