私はSlurmに800の仕事を提出しました。ジョブID/番号がその数より大きいジョブをキャンセルしたいのです(エラーがあるため)。一部は実行中で、一部はキューに正しくあるため、すべての操作をキャンセルしたくありません。
答え1
指定された数よりも大きいジョブをキャンセルする方法について厳密に答えることはありませんが、@mona-jalivandが解決しようとしている問題である説明された範囲内でジョブをキャンセルする問題を解決します。ここ
scancel {1000..1050}
bashスクリプトでジャンプするよりもはるかに簡単です...私はうまくいきます。
答え2
squeue
を使用して自分に属するすべてのジョブのリストを取得し、リストを繰り返して、基準(Xより大きいジョブID)に一致するすべてのジョブをキャンセルする必要がありますscancel
。
squeue
非常に柔軟な出力オプションがあり、-o
別名--format
オプションを使用すると、必要なものを正確に印刷するように指示できます。この場合、ジョブ番号のみが必要です。man squeue
によると、%i
フォーマット文字列は次のようになります。
%私ジョブまたはジョブステップ ID。
ジョブ配列の場合、ジョブID形式は「_」形式です。デフォルトでは、ジョブ配列インデックスフィールドのサイズは64バイトに制限されています。より大きなフィールドサイズを指定するには、環境変数 SLURM_BITSTR_LEN を使用します。 (ジョブおよびジョブステップに適用)異機種間ジョブ割り当ての場合、ジョブIDの形式は「#+#」の形式です。ここで、最初の数字は「異機種間作業リーダー」、2番目の数字は「異機種間作業リーダー」です。 「作業リーダー構成」、2番目の数字はゼロソースオフセットです。タスクのすべてのコンポーネント。
次の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
たとえば、Make it runningを使用してとして保存し、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に基づいてキューをソートします。この場合、画面下部には22222のような最大のジョブIDがあります。 11111が最初の無効なジョブIDの場合は、次のように範囲をキャンセルできます。
scancel {11111..22222}
これは{}
シェルによって拡張されます(echo {3..11..2}
例:try)。