1

有没有办法收集 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 启动的二进制文件的退出代码?

谢谢!

4

1 回答 1

1

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

  1. 如果您使用 bsub 提交作业以进行调度,则 bsub 命令会立即返回
  2. 后台列出项目,系统调度和调度你的工作

要查找实际工作量的状态,我可以为您提供几个选项。

选项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 的退出状态和退出代码列(作业 ID 是通过解析bsub提交作业时的输出获得的):

  • 如果状态栏是DONE您的工作已成功完成
  • 如果 status 列是,EXIT那么您的工作异常结束,您可以从 EXIT_CODE 列中获取退出代码
  • 如果状态列是RUN或者PEND然后您的工作分别正在运行或等待调度,您的代码应该稍等片刻sleep()并尝试bjobs再次调用。

请注意,bjobs上面的示例输出使用-o选项自定义输出以便于解析。这是一个相对较新的功能,如果您使用的是旧版本的 LSF,您将不得不在没有它的情况下使用它——可行,但涉及更多。

于 2015-12-23T20:58:42.460 回答