2012-08-03 11 views
9

मैं अमेज़ॅन ec2 पर जावा प्रक्रिया चला रहा हूं। यह 72 मिनट तक चला और फिर अचानक मुझे "जावा परिणाम 137" मिला। यह सब कुछ है, कोई अपवाद या कोई अन्य त्रुटि संदेश नहीं हैं। मैंने इस त्रुटि की खोज की है लेकिन कुछ भी उपयोगी नहीं मिला। इसका कारण क्या हो सकता है और इसे कैसे हल किया जा सकता है? कृपया मुझे बताओ।जावा परिणाम को हल करने 137

+0

क्या प्रक्रिया आप चल रहे हैं:

मैं यहाँ बच्चे प्रक्रिया से स्थिति लौटने के आरोप में विधि छोड़? शायद यह सिर्फ राज्य है कि प्रसंस्करण समाप्त कर दिया गया था; यह एक त्रुटि नहीं हो सकती है। –

+1

मेरा मानना ​​है कि "जावा परिणाम" के बाद की संख्या System.exit (int) को पास की गई मान है जब कोड निष्पादन को समाप्त करता है। आम तौर पर सम्मेलन यह है कि शून्य के अलावा कोई भी निकास कोड एक त्रुटि इंगित करता है, लेकिन यह खराब रूप है कि स्थिति को डीबग करने में आपकी सहायता के लिए कोई त्रुटि संदेश नहीं है। – Bobulous

+0

@ केविन मैंगोल्ड मैं क्लस्टर पर मोंगोडीबी में रिकॉर्ड डाल रहा हूं। 4 मशीनों पर 4 शर्ड्स हैं और यह जावा प्रक्रिया मोंगोस से जुड़कर दस्तावेज़ों को सम्मिलित करती है (जो दस्तावेजों को शार्ड्स पर घुमाता है)। मेरे कोड में, मैं System.exit() का उपयोग करता हूं लेकिन जब त्रुटि स्थिति पूरी हो जाती है तो यह स्पष्ट रूप से -1 देता है। अमेज़ॅन-ec2 टैगिंग के लिए भी धन्यवाद :), मुझे पोस्ट करते समय इसे करना चाहिए था। – Raghava

उत्तर

22

127 से ऊपर निकलने वाले कोड का अर्थ आम तौर पर Signal की प्रक्रिया को रोक दिया गया था।

निकास कोड 137 तब 128 + 9 तक हल हो जाता है, जबकि सिग्नल 9 सिगिल है, यानी प्रक्रिया को मजबूती से मार दिया गया था। यह दूसरों के बीच "kill -9" कमांड हो सकता है। हालांकि आपके मामले में यह ऑपरेटिंग सिस्टम पर मेमोरी हालत से बाहर हो सकता है, जो "ओओएम किलर" नामक कार्यक्षमता को उस प्रक्रिया को रोकने के लिए करता है जो ओएस को स्वयं स्थिर रखने के लिए अधिकांश मेमोरी का उपयोग कर रहा है शर्त।

इसी तरह की चर्चा के लिए this question देखें।

3

बस अगर कोई यह जानने में रुचि रखता है कि यह 128 नंबर कहां से आता है; कारण ओपनजेडीके स्रोत कोड में पाया जा सकता है। देखें: UNIXProcess_md.c

Java_java_lang_UNIXProcess_waitForProcessExit विधि में टिप्पणी से:

सबसे अच्छा मान देने के लिए 0x80 + संकेत संख्या है, क्योंकि क्या सभी यूनिक्स के गोले करना है कि, और क्योंकि यह अनुमति देता है कॉल करने की प्रक्रिया के बीच अंतर करना सिग्नल द्वारा बाहर निकलें और मौत की प्रक्रिया करें।

तो यही कारण है कि जेवीएम डेवलपर्स ने सिग्नल के कारण बाहर निकलने पर बच्चे की वापसी स्थिति में 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; 
    } 
} 
संबंधित मुद्दे