我有很多 bjobs 在 lsf 上运行,作业有两种状态:RUN 和 PEND。我想杀死所有处于 PEND 状态的 bjobs,如何使用脚本来做到这一点?我认为一种硬编码的方法是将它们保存在文件中,然后解析每一行以获取状态和密钥。如果 STAT 为 PEND,则将密钥传递给bkill $key
。但这非常复杂,是否有任何 bkill 函数可以直接执行此操作或以非硬编码方式杀死具有特定状态或名称的作业?
答案1
bjobs
可以只列出待处理的作业-p
。如果bkill -p
还可以过滤作业,那就太好了,这样bkill -p 0
会杀死所有用户的待处理作业。
我能想到的最好的办法就是一些贝壳魔法。虽然并不完美,但它应该涵盖很多情况。例如,
bkill `bjobs -p -o id -noheader | tr '\n' ' '`
bjobs -p -o id -noheader
列出用户待处理作业的作业 ID。tr
会将其放入预期的格式中bkill
。一个潜在的问题是,如果作业列表太长,则将超出最大命令行长度或最大命令行参数数量,因此 bash 会抱怨。
这里有一个小的竞争条件。作业可以在查询和终止之间启动。
答案2
另一种解决方案(也使用 shell 过滤器作为前面的答案,但没有超出允许的 shell 命令参数数量的风险):
bjobs -w | grep 'PEND' | awk '{print $1}' | xargs bkill
基本上检查正在运行的作业(-w 宽格式,不截断),用于grep
过滤 PENDing 作业,然后使用 来选择 jobID awk
,并通过 xargs 将它们传递给bkill
xargs(xargs 会破坏传递给 bkill 的参数数量,避免“参数列表太长”种错误)。