2012-08-03 12 views
9

私はamazon ec2でJavaプロセスを実行しています。それは72分のために走り、そして突然私は "java result 137"を得る。つまり、例外やその他のエラーメッセージはありません。私はこのエラーを検索しましたが、有用なものは何も見つかりませんでした。何が原因なのか、それを解決する方法は?私にお知らせください。Javaの結果を解決する137

+0

あなたはどのようなプロセスを実行しているの?たぶんそれは処理が終了したちょうど状態です。エラーではない可能性があります。 –

+1

"Java result"の後の数字は、コードが実行を終了するときにSystem.exit(int)に渡される値であると考えています。通常、慣例では、ゼロ以外の終了コードはエラーを示していますが、状況をデバッグするのに役立つエラーメッセージがないという貧弱な形式です。 – Bobulous

+0

@KevinMangoldクラスタ上のMongoDBにレコードを挿入しています。 4台のマシンに4つのシャードがあり、このJavaプロセスはMongoS(シャードに文書を転送するもの)に接続することによって文書を挿入します。私のコードでは、System.exit()を使用しますが、エラー条件が満たされたときに明示的に-1を返します。 amazon-ec2にもタグをつけていただきありがとうございます。投稿しているうちに完了しているはずです。 – Raghava

答えて

22

127を超える終了コードは、通常、Signalのためにプロセスが停止したことを意味します。

終了コード137は128 + 9に解決されますが、信号9はSIGKILLです。つまり、プロセスは強制終了されました。これは、とりわけ "kill -9"コマンドである可能性があります。しかし、あなたのケースでは、これはオペレーティングシステム上のメモリー不足状態である可能性があります。そのため、「OOM Killer」という機能が原因で、大部分のメモリーを使用しているプロセスが停止し、OS自体が安定します。調子。

this questionを参照してください。

3

誰かがこの128の番号の由来を知りたいと思っている場合に備えて、その理由は、OpenJDKのソースコードに記載されています。参照:UNIXProcess_md.c

Java_java_lang_UNIXProcess_waitForProcessExit方法でのコメント:

それはすべてのUnixシェルは何をすべきかであるので、それは発信者がプロセスを区別することができますので、返却するための最良の値は、0x80を+シグナル番号です終了し、シグナルによって死を処理する。

これは、JVM開発者が、シグナルのために子供が退室したときに子供の帰国ステータスに128を追加することを決めた理由です。

私はここで、子プロセスからのステータスを返すの担当法まま:

/* Block until a child process exits and return its exit code. 
    Note, can only be called once for any given pid. */ 
JNIEXPORT jint JNICALL 
Java_java_lang_UNIXProcess_waitForProcessExit(JNIEnv* env, 
               jobject junk, 
               jint pid) 
{ 
    /* We used to use waitid() on Solaris, waitpid() on Linux, but 
     * waitpid() is more standard, so use it on all POSIX platforms. */ 
    int status; 
    /* Wait for the child process to exit. This returns immediately if 
     the child has already exited. */ 
    while (waitpid(pid, &status, 0) < 0) { 
     switch (errno) { 
     case ECHILD: return 0; 
     case EINTR: break; 
     default: return -1; 
     } 
    } 

    if (WIFEXITED(status)) { 
     /* 
      * The child exited normally; get its exit code. 
      */ 
     return WEXITSTATUS(status); 
    } else if (WIFSIGNALED(status)) { 
     /* The child exited because of a signal. 
      * The best value to return is 0x80 + signal number, 
      * because that is what all Unix shells do, and because 
      * it allows callers to distinguish between process exit and 
      * process death by signal. 
      * Unfortunately, the historical behavior on Solaris is to return 
      * the signal number, and we preserve this for compatibility. */ 
#ifdef __solaris__ 
     return WTERMSIG(status); 
#else 
     return 0x80 + WTERMSIG(status); 
#endif 
    } else { 
     /* 
      * Unknown exit code; pass it through. 
      */ 
     return status; 
    } 
} 
関連する問題