如何取消 Slurm 上作业 ID(作业编号)大于特定数字的作业?

如何取消 Slurm 上作业 ID(作业编号)大于特定数字的作业?

我已经在 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}例如尝试)。

相关内容