我已经在 Slurm 上提交了 800 份工作。我想取消那些作业 ID/编号大于数字的作业(因为其中有错误)。我不想取消所有作业,因为有些作业正在运行,有些作业在队列中是正确的。
答案1
它并没有严格回答如何取消大于给定数量的作业,但它可以解决 @mona-jalilvand 试图解决的问题:取消所描述范围内的作业这里
scancel {1000..1050}
比进入 bash 脚本要简单得多......对我来说效果很好。
答案2
您需要使用squeue
获取属于您的所有作业的列表,然后循环该列表并取消与您的条件匹配的每个作业(作业 ID 大于 X)scancel
。
squeue
有非常灵活的输出选项,通过它的-o
又名--format
选项,您可以告诉它准确打印您想要的内容。在本例中,我们只需要工作编号。根据man squeue
,%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
将其另存为,例如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[@]}"
这与第一个脚本执行相同的操作,但效率稍高一些。
答案3
我经常使用
squeue -u $user | sort
根据作业 ID 对队列进行排序。在这种情况下,屏幕底部有最大的作业 ID,例如 22222。如果您发现 11111 是第一个坏作业 ID,您可以使用以下命令取消范围
scancel {11111..22222}
其中{}
由 shell 扩展(echo {3..11..2}
例如尝试)。