LSF 是一个批处理调度系统,因此您作为客户端与它的交互是异步的:
- 如果您使用 bsub 提交作业以进行调度,则 bsub 命令会立即返回
- 后台列出项目,系统调度和调度你的工作
要查找实际工作量的状态,我可以为您提供几个选项。
选项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,您将不得不在没有它的情况下使用它——可行,但涉及更多。