Systemctl के साथ रुकने के बाद सेवाएँ विफल स्थिति में रहती हैं


19

हमारे पास सेवा शैली में MineCraft सर्वर शुरू करने के लिए एक सरल सिस्टम स्क्रिप्ट है। एसओ 10 CentOS है। यहाँ स्क्रिप्ट है:

[Unit]
Description=Minecraft Server
After=syslog.target network.target

[Service]
Type=simple
WorkingDirectory=/root/Minecraft
ExecStart=/bin/java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui
Restart=on-failure

[Install]
WantedBy=multi-user.target

सेवा शुरू करना ठीक काम करता है लेकिन रुकने पर सेवा विफल स्थिति में रहती है। देख:

systemctl status minecraftd.service
minecraftd.service - Minecraft Server
   Loaded: loaded (/usr/lib/systemd/system/minecraftd.service; disabled)
   Active: active (running) since Mon 2015-06-01 16:00:12 UTC; 18s ago
 Main PID: 20975 (java)
   CGroup: /system.slice/minecraftd.service
           └─20975 /bin/java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui
systemctl stop minecraftd.service
systemctl status minecraftd.service
minecraftd.service - Minecraft Server
   Loaded: loaded (/usr/lib/systemd/system/minecraftd.service; disabled)
   Active: failed (Result: exit-code) since Mon 2015-06-01 16:01:37 UTC; 3s ago
  Process: 20975 ExecStart=/bin/java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui (code=exited, status=143)
 Main PID: 20975 (code=exited, status=143)

कोई उपाय?

धन्यवाद

जवाबों:


27

एग्जिट कोड 143 का मतलब है कि प्रोग्राम को बाहर निकलने के लिए निर्देश देने के लिए एक सिग्मर्ट सिग्नल मिला था, लेकिन उसने सिग्नल को ठीक से हैंडल नहीं किया। यह लगभग हमेशा प्रोग्रामिंग त्रुटियों के कारण होता है, और सभी प्रकार के जावा अनुप्रयोगों के साथ बहुत आम है।

आपको इकाई फ़ाइल में निकास कोड को "सफलता" निकास स्थिति के रूप में जोड़कर इसे दबाने में सक्षम होना चाहिए:

[Service]
SuccessExitStatus=143

यह काम करता हैं। अब सेवा अपेक्षित स्थिति में निष्क्रिय स्थिति में है।
कालिज

4
जावा एप्लिकेशन के साथ सिग्नल को संभालने का "उचित" तरीका क्या होगा? निकटतम मैं पा सकता हूं कि शटडाउन हुक होंगे, लेकिन कहीं भी प्रलेखन में यह उल्लेख नहीं है कि शटडाउन हुक आवेदन के निकास कोड को बदल देते हैं।
SPoage

@SPoage stackoverflow.com/q/2975248/1068283 लेकिन, ऐसा लगता है, जावा हमेशा इस मामले में कोड 143 के साथ बाहर निकलता है, भले ही एक शटडाउन हुक मौजूद हो।
माइकल हैम्पटन

11

माइकल के उत्तर के पूरक के लिए, एक्जिट कोड 143 यहां सामान्य है, यह तरीका है कि जावा वीएम को एक सिग्मर्ट सिग्नल प्राप्त हुआ, प्रक्रिया को रोकने के लिए सिस्टमड द्वारा भेजें। SIGTERM सिग्नल का संख्यात्मक मान 15 (देखें man signal) है।

अब Posix विनिर्देशन के अनुसार, "एक कमांड की निकास स्थिति जो समाप्त हो गई क्योंकि इसे एक संकेत प्राप्त हुआ था उसे 128 से अधिक बताया जाएगा"। ( http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_08_02 )

यहां जावा वीएम 128 + 15 जोड़ता है और आपको 143 का यह निकास कोड मिलता है।

यहां यह नॉन जीरो एग्जिट कोड होश में लाता है, क्योंकि यह देखने की अनुमति देता है कि आपका जावा प्रोग्राम बाहरी सिग्नल की वजह से बाहर निकला है, और आपको यह पता लगाने का मौका मिलता है कि कौन सा सिग्नल है।


संदर्भित POSIX विनिर्देशन पाठ निर्दिष्ट करता है कि एक शेल को कैसे व्यवहार करना चाहिए और कहता है "शेल एक कमांड भाषा इंटरसेप्टर है।" एक जावा वीएम उस विनिर्देश द्वारा कवर किया गया कुछ प्रतीत नहीं होता है। SIGTERM के कारण एक जावा VM (या कोई अन्य प्रोग्राम) समाप्त होने पर एक शेल की व्याख्या कैसे होती है - कि इसे बाहर निकलने का कोड 143 पर सेट करना चाहिए - निश्चित रूप से विनिर्देश द्वारा कवर किया गया है, लेकिन मुझे पूरा यकीन है कि यहां एक शेल शामिल नहीं है।
doshea

आप सही कह रहे हैं कि यह POSIX विनिर्देश UNIX शेल में निर्देशित है, लेकिन यहां ऐसा लगता है जैसे JVM के लेखकों ने अपने रिटर्न कोड को उसी तरह लागू करने का निर्णय लिया।
मनु
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.