सिस्टम के साथ जावा डेमन कॉन्फ़िगर करें


11

मैं systemdनौकरी के लिए इस परिभाषा का उपयोग कर रहा हूं :

 [Unit]
 Description=Some job

 [Service]
 ExecStart=/usr/local/sbin/somejob
 User=dlt
 Type=forking

 [Install]
 WantedBy=multi-user.target

स्क्रिप्ट को निम्नानुसार कहा जाता है (एक साधारण दिनचर्या को कॉल करना जो एक tcpip सॉकेट पर सुनता है और इनपुट को फ़ाइल में जोड़ता है:

 #!/bin/sh

 cd /home/user/tmp/testout
 nohup java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar </dev/null >/dev/null &

बाद systemctl start somejobके साथ चल रहा है, के रूप में इस प्रक्रिया से पता चलता है initअपने माता पिता के रूप:

 user@CANTANDO ~$ ps -u dlt eo pid,ppid,command
   PID  PPID COMMAND
  8718     1 java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar

प्रदर्शन करने systemctl stop somejobके बाद प्रक्रिया अब और नहीं दिखाती है (और पोर्ट बंद है)।

तो सब कुछ ठीक और बांका लगता है

मेरा प्रश्न है: क्या यह जावा डेमॉन के साथ चलने के लिए एक स्वीकार्य समाधान हैsystemd , या वहाँ केवेट हैं, और इस प्रकार इसे प्राप्त करने के बारे में और अधिक स्थिर या सुरक्षित तरीके हैं?

जवाबों:


14

यहाँ कुछ छोटे संशोधन हैं:

  1. चूंकि यह एक नेटवर्क सॉकेट पर सुनता है, इसलिए इसे निर्भरता बनाएं network.target
  2. nohupजरूरत नहीं है क्योंकि systemdआप के लिए निष्पादन योग्य होगा।
  3. मुझे लगता है कि एक अलग शेल स्क्रिप्ट एक ओवरकिल होगी, इसलिए इसे सेवा फ़ाइल में मर्ज करें।
  4. पुनर्निर्देशन ( < /dev/nullऔर आगे) की जरूरत नहीं है क्योंकि सिस्टमड एक उपयुक्त मानक I / O संदर्भ सेट करता है। वास्तव में, यदि आप रीडायरेक्शन को बाहर ले जाते हैं, तो सिस्टम अपने प्रोग्राम में जावा प्रोग्राम द्वारा मानक आउटपुट पर भेजी गई किसी भी चीज को लॉग करेगा, जिसमें कोई विशेष लॉगिंग तंत्र की आवश्यकता नहीं है।
  5. इनवोकिंग शेल ( &) से अतुलनीय रूप से भागना आवश्यक या उचित नहीं है।
  6. इसके लिए आवश्यक एक विशिष्ट व्यवहार पैटर्न है Type=forking, और अगर इसका पालन नहीं किया जाता है, तो चीजें गलत हो सकती हैं। तो Type=simple(या Type=notify) के लिए प्रयास करें ।

तो सेवा फ़ाइल इस तरह दिखती है:

[Unit]
Description=Some job
After=network.target

[Service]
WorkingDirectory=/home/user/tmp/testout
SyslogIdentifier=SocketTest
ExecStart=/bin/sh -c "exec java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar"
User=dlt
Type=simple

[Install]
WantedBy=multi-user.target

टिप्पणियाँ:

  1. आप केवल javaचलाने के लिए प्रोग्राम के नाम के रूप में उपयोग नहीं कर सकते । systemd PATHनिष्पादक के लिए खोज नहीं करता है , और निष्पादन योग्य का नाम ExecStartनिरपेक्ष होना चाहिए। इसलिए यदि आप रास्ता खोज रहे हैं तो आपको शेल या के माध्यम से आह्वान करना होगा /usr/bin/env। हम /bin/shयहां चुनते हैं।
  2. क्योंकि यह Type=simpleशेल execजावा है, इसे चाइल्ड प्रोसेस के रूप में न चलाएं। systemd मुख्य प्रक्रिया के माध्यम से सेवा को नियंत्रित करता है, और इसके लिए जावा की आवश्यकता होती है, माता-पिता की शेल प्रक्रिया की नहीं।
  3. क्योंकि यह जावा निष्पादन योग्य को सीधे लागू नहीं कर रहा है, सिस्टमड नाम shको अपनी पत्रिका में सेवा नाम के रूप में रखेगा । देखें कि इससे कैसे बचें / usr / bin / env इस पर अधिक के लिए निष्पादन योग्य के रूप में सिस्टम लॉग में चिह्नित किया जा रहा है

जहां तक ​​मुझे पता है, सिस्टमड के साथ जावा एप्लिकेशन को चलाने का कोई विशेष चेतावनी नहीं है।


1
यह काम नहीं करेगा। समस्या 1: यह शेल नहीं है; कोई पुनर्निर्देशन ऑपरेटर नहीं हैं। आप वास्तव में वैसे भी पुनर्निर्देशन नहीं चाहते हैं। समस्या 2: ExecStart पूर्ण पथनाम की मांग करता है। समस्या 3: unix.stackexchange.com/questions/229523
JdeBP

अच्छा लगा सर। मैं केवल समस्या को ठीक करने का प्रबंधन कर सकता हूं। आप प्रोब 2,3 को ठीक करने के बारे में क्या जानते हैं?
यूं-चीह चेन

1
उत्तर को संपादित के रूप में देखें।
JDBP

मुझे नहीं लगता कि यहां श आवश्यक है।
फ़ाहो

नमस्कार @ यूं-चिंचन आप इस प्रक्रिया को कैसे रोकते हैं। ExecStrop कैसा दिखेगा? मैं एक pid फ़ाइल के साथ init.d का उपयोग कर रहा हूं लेकिन यह आसान है। इसलिए मुझे यह सुनिश्चित करने की आवश्यकता थी कि मुझे पता है कि मुझे कैसे रोकना है आदि। धन्यवाद
काली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.