পরিষেবাদি সিস্টেমেস্টেল বন্ধ হওয়ার পরে ব্যর্থ অবস্থায় থেকে যায়


19

সার্ভিস ফ্যাশনে মাইনক্রাফ্ট সার্ভার শুরু করার জন্য আমাদের কাছে একটি সহজ সিস্টেমড স্ক্রিপ্ট রয়েছে। এসওটি সেন্টোস is. এখানে স্ক্রিপ্ট:

[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 এর অর্থ হল প্রোগ্রামটি প্রস্থান করার নির্দেশ দেওয়ার জন্য একটি SIGTERM সিগন্যাল পেয়েছিল তবে এটি সিগন্যালটি সঠিকভাবে পরিচালনা করে নি। এটি প্রায়শই প্রোগ্রামিং ত্রুটির কারণে ঘটে থাকে এবং সমস্ত ধরণের জাভা অ্যাপ্লিকেশনগুলির সাথে বেশ সাধারণ।

আপনি "সাফল্য" প্রস্থান স্থিতি হিসাবে ইউনিট ফাইলে প্রস্থান কোড যুক্ত করে এটি দমন করতে সক্ষম হবেন:

[Service]
SuccessExitStatus=143

এটা কাজ করে। প্রত্যাশা অনুযায়ী এখন পরিষেবাটি নিষ্ক্রিয় স্থিতিতে রয়েছে।
ক্যালিস

4
জাভা অ্যাপ্লিকেশন দিয়ে সিগন্যালটি হ্যান্ডেল করার "যথাযথ" উপায় কী হবে? আমি যে নিকটতমটি সন্ধান করতে পারি তা হ'ল শাটডাউন হুকগুলি, তবে ডকুমেন্টেশনে কোথাও উল্লেখ করা হয়নি যে শাটডাউন হুকগুলি অ্যাপ্লিকেশনটির প্রস্থান কোডকে পরিবর্তন করে।
স্পোয়েজ

@SPoage stackoverflow.com/q/2975248/1068283 কিন্তু মনে হয়, জাভা সবসময় এই ক্ষেত্রে কোড 143 সঙ্গে প্রস্থান করে, এমনকি যদি শাটডাউন হুক উপস্থিত।
মাইকেল হ্যাম্পটন

11

মাইকেল এর উত্তরের পরিপূরক হিসাবে, প্রস্থান কোড 143 এখানে স্বাভাবিক, এটি জাভা ভিএম একটি প্রক্রিয়া বন্ধ করার জন্য সিস্টেম্ড দ্বারা প্রেরণ করে একটি SIGTERM সিগন্যাল পেয়েছিল। SIGTERM সিগন্যালের সংখ্যার মান 15 (দেখুন man signal) রয়েছে।

এখন পজিক্সের স্পেসিফিকেশন অনুসারে, "কোনও কমান্ডের সমাপ্ত হওয়া কমান্ডের প্রস্থান স্থিতি কারণ এটি একটি সংকেত পেয়েছে 128 এর চেয়ে বেশি হিসাবে রিপোর্ট করা হবে"। ( http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_08_02 )

এখানে জাভা ভিএম 128 + 15 যুক্ত করে এবং আপনি এই প্রস্থান কোডটি 143 পান।

এখানে এই শূন্য নয় এমন প্রস্থান কোডটি হুঁশ তৈরি করে, কারণ এটি আপনার জাভা প্রোগ্রামটি বাহ্যিক সংকেতের কারণে প্রস্থান করেছে এবং কোন সংকেতটি খুঁজে বের করার সুযোগ পেয়েছে তা দেখতে দেয়।


রেফারেন্সযুক্ত পসিক্স স্পেসিফিকেশন পাঠ্যটি শেলটি কীভাবে আচরণ করা উচিত তা নির্দিষ্ট করে বলে মনে হচ্ছে এবং "শেলটি একটি কমান্ড ভাষার অনুবাদক।" একটি জাভা ভিএম সেই স্পেসিফিকেশন দ্বারা আবৃত কিছু বলে মনে হচ্ছে না। একটি শেল একটি জাভা ভিএম (বা অন্য কোনও প্রোগ্রাম) কীভাবে সিগন্যটারের কারণে শেষ করে তা ব্যাখ্যা করে - এটির প্রস্থান কোডটি 143 তে নির্ধারণ করা উচিত - অবশ্যই স্পেসিফিকেশন দ্বারা আচ্ছাদিত রয়েছে তবে আমি নিশ্চিত যে এখানে কোনও শেল জড়িত নেই।
দোষিয়া

আপনি ঠিক বলেছেন যে এই পসিএক্স স্পেসিফিকেশনটি ইউনিক্স শেলের দিকে নির্দেশিত হয়েছে, তবে এখানে এটি দেখে মনে হচ্ছে যে জেভিএম লেখকরা তাদের রিটার্ন কোডটি একইভাবে প্রয়োগ করার সিদ্ধান্ত নিয়েছে।
মানু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.