प्रक्रिया जावा अभी भी मारे जा रहे हैं


11

मुझे अपने विश्वविद्यालय के सर्वर पर जावा प्रोग्राम चलाने की आवश्यकता है। मैं दूरस्थ रूप से ssh के माध्यम से उनके सर्वर में प्रवेश कर रहा हूं

इसलिए मैंने नोह का इस्तेमाल किया जैसे:

nohup java -jar project.jar &

हालाँकि जब मैं लॉगआउट करता हूं और टर्मिनल को बंद करता हूं तो सर्वर में वापस लॉग इन करता हूं मेरी प्रक्रिया गायब है / मारे गए।


पुनर्निर्देशित करने की कोशिश करें stdoutऔर stderrकुछ फ़ाइलों के लिए - आपकी प्रक्रिया को SITUP के अलावा सिग्नल द्वारा मार दिया जा सकता है, जब किसी बंद टर्मिनल पर लिखने की कोशिश की जा रही हो stdout/ stderr। जैसे नौकरी साइन >/dev/null 2>&1से पहले अपने कमांड में जोड़ें &
बोरिस बुर्कोव

1
@ याकूब के साथ आवश्यक नहीं होना चाहिए nohup- अधिकांश कार्यान्वयन डिफ़ॉल्ट रूप से ऐसा करेंगे, हालांकि यह stdinउदाहरण के लिए पुनर्निर्देशित करना आवश्यक हो सकता है </dev/null
ग्रीम

जवाबों:


14

nohupकेवल कार्यक्रम के लिए प्रतिरक्षा SIGHUPऔर SIGQUITसंकेत बनाते हैं । आधुनिक शेल शायद आपके सत्र से लॉगआउट करते समय अन्य संकेत भेजते हैं, इसलिए कोई गारंटी नहीं है कि आपका प्रोग्राम मारा नहीं गया है, यहां तक ​​कि नीचे चल रहा है nohup

बेहतर समाधान उपयोग कर रहा है tmuxया screen, या यदि आप उपयोग करते हैं bash, तो आप कोशिश कर सकते हैं:

$ java -jar project.jar &
$ disown

यदि आप उपयोग करते हैं disown, तो आपको मैन्युअल रूप से पुनर्निर्देशित करने की आवश्यकता है, उदाहरण के लिए</dev/null &>/dev/null
ग्रीम

@ ग्रीम: मुझे लगता है कि अगर हम अब शेल के साथ काम नहीं करते हैं (केवल कमांड चलाते हैं और बाहर निकलते हैं), तो पुनर्निर्देशित करने की कोई आवश्यकता नहीं है।
कोउन्ग्लम

कोशिश करो ssh localhost 'sleep 10m & disown'bashबाहर नहीं निकलेगा।
ग्रीम

ठीक है, ऐसा लगता है sshकि टर्मिनल से जुड़े कार्यक्रम हैं तो बाहर नहीं निकलते। हालाँकि, यदि आप अंतःक्रियात्मक रूप से चलते हैं, तो उपरोक्त ठीक है।
ग्रीम

लिनक्स (जीएनयू कोरुटिल्स और बिजीबॉक्स) और बीएसडी के कार्यान्वयन nohupकमांड को प्रतिरक्षा नहीं बनाते हैं SIGQUIT, लेकिन केवल करने के लिए SIGHUP। यह स्पष्ट रूप से मानक के खिलाफ होगा और AFAIK केवल (?) के कुछ संस्करणों पर हो सकता है।
मॉस्कीव

13

अभी तक (क्रॉनिक रूप से शिथिल) के स्थान पर एक और विकल्प nohup:

setsid java -jar project.jar </dev/zero &>/dev/null &

यह प्रभावी रूप से प्रक्रिया का "डेमनीज" करता है। यह अब init के स्वामित्व में है, इसलिए HUP'd को कभी नहीं मिलेगा, इसके I / O स्ट्रीम सुरक्षित हैं, और इसे बैकग्राउंड में फोर्क किया गया है।

man setsidअधिक जानकारी के लिए देखें । इसके विपरीत screenया tmux, यह एक कार्यक्रम नहीं है जो स्वामित्व का दावा करता है और चलता रहता है। यह बस अपने स्वयं के प्रक्रिया समूह में एक कार्यक्रम शुरू करता है ।


क्यों होता है नपुंसक?
cpugeniusmv

@cpugeniusmv मुझे यकीन है कि यह कुछ के लिए अच्छा है, हालांकि, मुझे यह एक ऐसे उद्देश्य के लिए विश्वसनीय नहीं लगा, जिसके लिए अक्सर सिफारिश की जाती है, कहीं लॉगिंग, एक प्रक्रिया शुरू करना, और लॉग आउट करना (ओपी की तरह)। मुझे लगता है कि इसका दुरुपयोग किया जा सकता था, और शायद setsidइस तरह से थोड़ा और बेवकूफ सबूत है। यह नोहूप द्वारा निहित एक कदम को छोड़ देता है (प्रक्रिया एक अनाथ के रूप में init द्वारा फिर से parented)। nohupयदि आप संभावित रूप से बाद में काम को आगे बढ़ाना चाहते हैं तो अधिक लचीला होगा।
गोल्डीलॉक्स

@ TAFKA'goldilocks 'मुझे लगता है कि समस्या स्टड, स्टडआउट और स्टैडर को संभालने में है, जो वास्तव में नहीं है (लेकिन आंशिक रूप से (!)) Nohup द्वारा नियंत्रित किया जाता है। Nohup यह मुख्य काम बहुत अच्छी तरह से करता है, इस प्रक्रिया को SIGHUP से बचाते हैं। लेकिन बहुत सारी चीजें हैं जो धाराओं के साथ गलत हो सकती हैं - या, बहुत बदतर, कभी-कभी गलत हो जाती हैं, जो कि बफर के आकार पर निर्भर करता है। मैं कहता हूँ, नहीं, कोई गलत नहीं है, लेकिन उम्मीद है कि कोई भी काम नहीं करता है।
वोल्कर सेगेल

3

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

ट्यूटोरियल: http://www.rackaid.com/blog/linux-screen-tutorial-and-how-to/


-2

अपने nohup को STDOUT और STDERR के साथ रीडायरेक्ट करने की कोशिश करें:

nohup java -jar project.jar 2>&1 &

1
आप केवल stdout को stderr को पुनर्निर्देशित कर रहे हैं, जो कुछ भी नहीं बदलता है कि nohup कैसे संचालित होता है (यह दोनों को पुनर्निर्देशित करता है nohup.out)।
गिलेस एसओ- बुराई को रोकना '

1
-1, मुझे लगता है कि आपका मतलब है nohup java -jar project.jar 2>/dev/null &लेकिन आप स्पष्ट रूप से नहीं जानते कि आप क्या कर रहे हैं। और भी बेहतर, फ़ीड भी stdin /dev/null
प्लाज़्मापावर

@PlasmaPower यहां आपके पास अपना +1 है। आपका दिन शुभ हो :)
boris quiroz
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.