有没有办法收集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启动的二进制文件的退出代码?
谢谢!
答案 0 :(得分:1)
LSF是一个批处理调度系统,因此您作为客户端与它的交互是异步的:
要查找实际工作负载的状态,我可以为您提供几个选项。
选项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列中获取退出代码RUN
或PEND
,那么您的作业正在运行或等待分发,您的代码应该sleep()
一段时间,然后尝试拨打bjobs
试。请注意,上面的示例bjobs
输出使用-o
选项来自定义输出以便于解析。这是一个相对较新的功能,如果你使用的是较旧版本的LSF,你必须在没有它的情况下做 - 可行,但需要更多参与。