2015-12-22 79 views
1

有沒有辦法收集bsub發起的工作的退出碼?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

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(通過提交作業時解析的bsub輸出獲得的作業ID)的列:

  • 如果狀態欄是DONE如果狀態欄是EXIT那麼你的工作異常結束,你可以從EXIT_CODE列
  • 如果狀態colu退出代碼你的工作順利完成
  • mn是RUNPEND那麼你的工作正在運行或等待分派,你的代碼應該在sleep()一會兒,然後再試着撥打bjobs

注意,上面的例子bjobs輸出使用-o選項來定製容易解析的輸出。這是一個相對較新的功能,如果您使用的是舊版本的LSF,則必須在沒有該功能的情況下才能做到 - 可行,但需要更多參與。