You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何让C Shell脚本等待LSF作业完成后再执行后续命令?

我平时处理LSF任务同步的需求时,最常用下面这几个方案,亲测能完美解决你说的“提交任务后脚本直接跑后续命令”的问题:

方案1:阻塞式提交(最简便)

LSF的bsub命令本身就支持阻塞模式,只需要加-K参数,提交任务后脚本会一直等待作业完成(不管是成功还是失败),才会继续执行后续命令。

举个实际例子:

# 原来的非阻塞提交命令
# bsub -q my_queue "python my_task.py"

# 改成带-K的阻塞提交
bsub -K -q my_queue "python my_task.py"

# 下面的命令会等上面的LSF作业完成后才执行
echo "LSF作业已完成,开始处理输出文件..."
python process_output.py
mv result.txt ./output_dir/

注意:如果你的任务是数组作业(比如bsub -J "my_array[1-10]"),-K会自动等待所有数组任务全部完成后才放行,非常省心。

方案2:轮询作业状态(灵活可控)

如果因为某些原因不能用-K(比如老版本LSF不支持,或者需要在等待期间做一些其他操作),可以自己写个循环,通过bjobs命令监控作业状态。

步骤是:先提交任务并捕获作业ID,然后定期检查作业是否存在/完成,直到满足条件再继续。

示例代码:

# 提交任务并提取作业ID(适配LSF默认输出格式:Job <12345> is submitted to queue <my_queue>.)
JOB_ID=$(bsub -q my_queue "python my_task.py" | grep -oP '\d+')

# 轮询检查作业状态
while true; do
    # 检查作业是否还在运行/排队
    bjobs $JOB_ID > /dev/null 2>&1
    # 如果bjobs返回非0,说明作业已完成/退出/被取消
    if [ $? -ne 0 ]; then
        break
    fi
    # 每隔30秒检查一次,可根据需求调整间隔
    sleep 30
done

# 后续处理命令
echo "作业已结束,开始处理输出..."
# 你的命令集

如果需要更精准的状态判断(比如只在作业成功完成时才执行后续命令),可以解析bjobs的状态字段:

while true; do
    # 获取作业状态(第二行第三列是STAT字段)
    STATUS=$(bjobs $JOB_ID 2>/dev/null | awk 'NR==2 {print $3}')
    # 当状态为DONE(成功)或EXIT(失败)时退出循环
    if [ "$STATUS" = "DONE" ] || [ "$STATUS" = "EXIT" ]; then
        # 可选:如果只在成功时执行后续命令,这里可以加判断
        if [ "$STATUS" = "DONE" ]; then
            echo "作业成功完成"
        else
            echo "作业失败,退出状态:$STATUS"
            # 可选:失败时退出脚本
            # exit 1
        fi
        break
    fi
    sleep 30
done

方案3:用LSF原生工具bwait(更可靠)

LSF专门提供了bwait命令来等待指定作业完成,比自己写循环更稳定,还支持复杂的等待条件。

用法示例:

# 提交任务并捕获作业ID
JOB_ID=$(bsub -q my_queue "python my_task.py" | grep -oP '\d+')

# 等待作业完成(done()表示等待作业进入完成状态)
bwait -w "done($JOB_ID)"

# 后续命令
echo "作业完成,开始处理输出..."

bwait还支持等待多个作业,比如bwait -w "done($JOB_ID1) && done($JOB_ID2)",或者设置超时时间(-t 3600表示最多等1小时),非常灵活。


额外注意事项

  1. 确保脚本运行的环境能正常调用LSF命令(bsub, bjobs, bwait),有些集群需要先加载LSF模块,比如module load lsf
  2. 如果作业被手动取消(bkill),上述三种方法都会检测到作业结束,你可以根据需求在脚本里添加对应的错误处理逻辑。

内容的提问来源于stack exchange,提问作者王云龙

火山引擎 最新活动