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 はバッチ スケジューリング システムであるため、クライアントとしての 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ジョブが正常に完了した場合
  • ステータス列が のEXIT場合、ジョブは異常終了し、EXIT_CODE 列から終了コードを取得できます
  • ステータス列が であるRUNPEND、ジョブが実行中またはディスパッチを待機している場合、コードはsleep()しばらくの間、bjobs再度呼び出しを試行する必要があります。

上記の出力例では、簡単に解析できるように出力をカスタマイズするオプションをbjobs使用していることに注意してください。-oこれは比較的新しい機能です。古いバージョンの LSF を使用している場合は、これを使用せずに済ませる必要があります。実行可能ですが、もう少し複雑です。

于 2015-12-23T20:58:42.460 に答える