पृष्ठभूमि प्रक्रिया के रूप में एक सर्वर पर जावा जार फ़ाइल चलाएँ


105

मुझे दो अनुप्रयोगों के बीच संवाद करने के लिए सर्वर में जावा जार चलाने की आवश्यकता है। मैंने इसे चलाने के लिए दो शेल स्क्रिप्ट लिखी हैं, लेकिन एक बार जब मैं उस स्क्रिप्ट को शुरू करता हूं तो मैं इस प्रक्रिया को बंद / समाप्त नहीं कर सकता। अगर मैं प्रेस ctrl+ Cया करीबी कंसोल, सर्वर बंद हो जाएगा। क्या कोई मेरी मदद कर सकता है कि इस स्क्रिप्ट को सामान्य सर्वर के रूप में चलाने के लिए कैसे संशोधित किया जाए?

 #!/bin/sh
java -jar /web/server.jar
echo $! 
#> startupApp.pid

जवाबों:


242

आप यह कोशिश कर सकते हैं:

#!/bin/sh
nohup java -jar /web/server.jar &

& प्रतीक, पृष्ठभूमि में चलने के लिए प्रोग्राम को स्विच करता है।

आपके द्वारा लॉग आउट करने के बाद भी nohup उपयोगिता कमांड को बैकग्राउंड में रन तर्क के रूप में पारित करती है।


धन्यवाद एंटोन, प्रक्रिया आईडी को मारकर सर्वर को रोकना मुश्किल है। मुझे नहीं लगता कि यह सर्वर को रोकने के लिए सबसे अच्छा अभ्यास है।
बर्नड अली

3
संक्षिप्त उत्तर: यह सर्वर पर निर्भर करता है। लंबे उत्तर: जहां तक ​​मुझे पता है, इस तरह के सुंदर शट डाउन का समर्थन करने वाली प्रक्रिया के बिना एक प्रक्रिया को बंद करने का कोई सुरक्षित तरीका नहीं है। उदाहरण के लिए, यदि यह एक बाहरी संकेत द्वारा समाप्त किया जा रहा वेब सर्वर है, तो हमेशा एक संभावना है कि कुछ अनुरोध खो जाएंगे। इस समस्या को हल करने का एक तरीका यह है कि एक विशेष प्रकार के अनुरोधों को संसाधित करके, सर्वर में एक सुंदर समाप्ति फ़ंक्शन को लागू किया जाए। फिर, सर्वर को उस विशेष प्रकार का अनुरोध भेजकर समाप्त किया जा सकता है। अन्यथा, इसकी आईडी द्वारा प्रक्रिया को मारना सरल तरीका है।
एंटन बेलोग्लाज़ोव

1
उपयोग करने nohupको हमेशा रिडायरेक्टिंग स्टडआउट और स्टेडर के साथ स्पष्ट रूप से जोड़ा जाना चाहिए - अन्यथा, आपको इस बात का नियंत्रण नहीं है कि लॉग कहाँ जाते हैं, और nohup.outजो भी इस निर्देशिका से उत्पन्न होता है उसमें एक बदसूरत निर्देशिका के साथ समाप्त होता है।
चार्ल्स डफी

@ जब मैं SSH EXEC runjar.sh के साथ एक स्क्रिप्ट (आपके उत्तर की तरह) चलाता हूं। इसने मेरे स्थानीय टर्मिनल में लॉग को स्ट्रीम करना शुरू कर दिया और यदि मेरा टर्मिनल बंद हो जाता है तो मेरा जार मर जाता है। मैं SSH EXEC का उपयोग करके पृष्ठभूमि में जार कैसे चला सकता हूं?
एंथहाइट रेज़रन

47

सिस्टमड जो अब अधिकांश विकृतियों में चलता है

चरण 1:

अपने उपयोगकर्ता परिभाषित सेवाओं का पता लगाएं मेरा था पर था /usr/lib/systemd/system/

चरण 2:

अपने पसंदीदा टेक्स्ट एडिटर के नाम से एक टेक्स्ट फाइल बनाएं whatever_you_want.service

चरण 3:

फ़ाइल के लिए निम्नलिखित टेम्पलेट रखो whatever_you_want.service

[Unit]
Description=webserver Daemon

[Service]
ExecStart=/usr/bin/java -jar /web/server.jar
User=user

[Install]
WantedBy=multi-user.target

चरण 4:

सुपर यूजर के रूप में अपनी सेवा चलाएं

$ systemctl start whatever_you_want.service # starts the service
$ systemctl enable whatever_you_want.service # auto starts the service
$ systemctl disable whatever_you_want.service # stops autostart
$ systemctl stop whatever_you_want.service # stops the service
$ systemctl restart whatever_you_want.service # restarts the service

यह करने का आधुनिक तरीका है
EarthMind

4
aub ubutnu छवि पर मुझे systemd स्थापित करना था, फिर छवि को / etc / systemd / system / में पाया
Robbo_UK

29

यदि आप उबंटू का उपयोग कर रहे हैं और "अपस्टार्ट" ( http://upstart.ubuntu.com/ ) कर सकते हैं, तो आप यह कोशिश कर सकते हैं:

सृजन करना /var/init/yourservice.conf

निम्नलिखित सामग्री के साथ

description "Your Java Service"  
author "You"  

start on runlevel [3]  
stop on shutdown  

expect fork  

script     
    cd /web 
    java -jar server.jar >/var/log/yourservice.log 2>&1  
    emit yourservice_running  
end script  

अब आप service yourservice startऔर service yourservice stopआदेश जारी कर सकते हैं । आप /var/log/yourservice.logसत्यापित कर सकते हैं कि यह काम कर रहा है।

यदि आप अपने कंसोल को बिना विंडो को हिलाए केवल कंसोल से चलाना चाहते हैं, तो आप बस यह कर सकते हैं:

java -jar /web/server.jar > /var/log/yourservice.log 2>&1

3
क्या यह एक प्रणालीगत सेवा है? यह प्रश्न लिनक्स को टैग नहीं किया गया है, और बहुत कम डिस्ट्रोस में डिफ़ॉल्ट रूप से सिस्टमड है।
जोर्डन

1
मैं यह कहने के लिए प्रश्न को संशोधित करूंगा कि यह "अपस्टार्ट" का उपयोग कर रहा है जो कि ubuntu में शामिल है।
स्ट्रेलोक

1
मैं अंतिम सलाह के लिए विश्वास करता हूं यदि आप चाहते हैं कि यह पृष्ठभूमि में चले और शेल जारी हो जाए, तो आपको करना चाहिए:java -jar /web/server.jar > /var/log/yourservice.log 2>&1 &
मोंटारो

डिफ़ॉल्ट रूप से सभी सिस्टम नौकरियां निम्नलिखित निर्देशिका में रहती हैं: / etc / init / ... डिफ़ॉल्ट रूप से, Ubuntu 14.04 में कोई / var / init / निर्देशिका नहीं है।
माइकल लाफयेट

इसके अलावा, एक सेवा शुरू करने के लिए "सुडो" की आवश्यकता होती है। सूडो सेवा तुम्हारा काम शुरू
माइकल लाफेट

2

पृष्ठभूमि में चलाएं और लॉग फाइल में निम्न का उपयोग करके लॉग जोड़ें:

nohup java -jar /web/server.jar > log.log 2>&1 &
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.