退出bsub启动的作业代码

时间:2015-12-22 12:19:23

标签: c++ lsf

有没有办法收集bsub发布的作业的退出代码?

例如:bsub启动了一个脚本test.sh(test.sh包含一些彼此推出的二进制文件)。

std::string cmdLine = "bsub test.sh";
File *fp = popen(cmdLine.c_str());
int retcode = pclose(fp); // this returns exit code of bsub (not wanted in this scenario)

我正在寻找一种方法来获取由bsub启动的二进制文件的退出代码?

谢谢!

1 个答案:

答案 0 :(得分:1)

LSF是一个批处理调度系统,因此您作为客户端与它的交互是异步的:

  1. 使用bsub,bsub命令提交作业以进行日程安排 马上回来
  2. 在后台列出项目,系统时间表和 派遣你的工作
  3. 要查找实际工作负载的状态,我可以为您提供几个选项。

    选项1

    强制bsub同步行动。考虑到代码示例的当前状态,这可能是最简单的选项:基本上您所要做的就是给bsub -K选项。这导致命令在作业排队,调度和完成之前基本上不返回,然后命令将返回作业的退出代码,如下所示:

    std::string cmdLine = "bsub -K test.sh";  // Use -K option
    File *fp = popen(cmdLine.c_str());
    int retcode = pclose(fp);  // this will now return the exit code of test.sh
    

    选项2

    有些网站不喜欢让用户出于各种原因使用-K选项。如果是这种情况,那么您需要使用bjobs命令在系统中查询作业状态。

    基本上,在bsub返回后,您的代码将重复调用bjobs命令并解析输出以确定作业的退出状态。例如:

    $ bjobs -o 'stat exit_code' 6308
    STAT EXIT_CODE
    DONE -
    

    为我提供了退出状态列和作业ID 6308的退出代码(通过在提交作业时解析bsub的输出来获取作业ID):

    • 如果状态列为DONE,则表明您的工作已成功完成
    • 如果状态列为EXIT,那么您的作业异常结束,您可以从EXIT_CODE列中获取退出代码
    • 如果状态列为RUNPEND,那么您的作业正在运行或等待分发,您的代码应该sleep()一段时间,然后尝试拨打bjobs试。

    请注意,上面的示例bjobs输出使用-o选项来自定义输出以便于解析。这是一个相对较新的功能,如果你使用的是较旧版本的LSF,你必须在没有它的情况下做 - 可行,但需要更多参与。