लिनक्स में एक कस्टम प्रोसेस नाम के साथ एक प्रोग्राम चलाना


0

मैं लिनक्स के लिए काफी नया हूँ

मुझे एक जावा प्रक्रिया बनाने की आवश्यकता है जो एक अनाथ है (किसी भी प्रक्रिया का बच्चा नहीं है) और इसे या तो एक सेवा होना चाहिए या एक अद्वितीय प्रक्रिया का नाम होना चाहिए ताकि जब भी मुझे पसंद हो मैं इसे रोक सकूं।

मूल रूप से मैं Gitlab को CI से जावा सर्वर को तैनात करने की कोशिश कर रहा हूं। यदि कोई पहले से ही चल रहा है, तो एक सर्वर इंस्टेंस को पहचानने और मारने के लिए प्रत्येक CI बिल्ड की आवश्यकता होती है, और एक नया बनाएं। (सर्वर को एक अनाथ के रूप में भी चलना चाहिए अन्यथा सीआई बिल्ड सर्वर के समाप्त होने के इंतजार में फंस जाता है।)

निश्चित रूप से, मैं सिर्फ सभी चल रही जावा प्रक्रियाओं को मार सकता हूं, लेकिन मैं एक क्लीनर तरीका चाहूंगा यदि मेरे पास एक जावा प्रक्रिया चल रही है जो सर्वर नहीं है।

मैंने एक उपनाम बनाने की कोशिश की, लेकिन जब तक मैं टर्मिनल में उपनाम की कोशिश नहीं करता, तब तक बैश दिखाई नहीं देता। ( उबंटू अपस्टार्ट पर एक सेवा कैसे बनाएं? मैंने शेल स्क्रिप्ट में एक उपनाम चलाने के लिए निर्देश का पालन करके .bashrc और .bash_aliases को सम्मिलित करके एक फ़ंक्शन का उपयोग करने की कोशिश की ? यह जांचने के लिए कि क्या यह एक उपनाम की तरह काम करेगा और एक कस्टम है? प्रक्रिया का नाम लेकिन यह भी विफल रहा।

मैं एक सेवा करूंगा लेकिन मैं लिनक्स के लिए नया हूं और यह नहीं जानता कि कैसे, प्लस निर्देशिका जहां जार संग्रहीत है हर निर्माण में परिवर्तन होता है। मुझे नहीं पता कि मैं निर्देशिका को सेवा में कैसे पास करूंगा ताकि जावा जानता है कि यह क्या चल रहा है।

जवाबों:


2

इसके लिए पारंपरिक यूनिक्स समाधान एक ज्ञात स्थान के साथ एक फ़ाइल में पीआईडी को संग्रहीत करना है , फिर आवश्यकता होने पर उस फ़ाइल की सामग्री का उपयोग करें। यह अक्सर, अगर अकल्पनीय रूप से, एक पिड-फाइल कहा जाता है।

उदाहरण के लिए, जब sshdडेमॉन / सेवा शुरू की जाती है, तो उसका पीआईडी ​​नाम की एक फ़ाइल को लिखा जाता है sshd.pid। बाद में जब यह sshd को रोकने के लिए वांछित होता है, या इसे पुन: कॉन्फ़िगर करने के लिए संकेत देता है, तो यह फ़ाइल पढ़ी जाती है, और यदि sshdरोक दी जाती है तो फ़ाइल निकाल दी जाती है। पिड-फाइल के लिए 'सामान्य' स्थान अंदर या नीचे है, /var/runलेकिन आप कभी-कभी पुराने सिस्टम या प्रोग्राम का उपयोग करते हैं /etcया यहां तक ​​कि पाते हैं /, और कुछ भी ऐसा नहीं है जो /home/testcontrollerआप चाहते हैं।

जोड़ा गया: प्रक्रिया शुरू करने वाले किसी भी निर्माता को अपनी पिड-फाइल लिखना चाहिए या प्रक्रिया को स्वयं ऐसा करना चाहिए; कुछ कार्यक्रम बाद में अपने आप हो जाते हैं लेकिन जावा (और आसानी से नहीं बदला जा सकता है) इसलिए आपको पूर्व की आवश्यकता है। मुझे नहीं पता है और आप यह नहीं कहते हैं कि गिटलैब कैसे चीजें चलाता है लेकिन आप बैश का उल्लेख करते हैं; अगर यह एक bash स्क्रिप्ट का उपयोग कर रहा है जिसे आप नियंत्रित करते हैं जो कुछ अधिक या कम पसंद करता है

$somejre/java -Xmx99G -Dsome=config -Dmore=config -jar $appjar some args & # & for nowait aka background

उसके बाद तुरंत जोड़ें

echo $! >$somelocation/myjava.pid # $! is the PID the most recent 'nowait' process 

और जब आप इसे रोकना चाहते हैं, तो एक ही फ़ाइल का उपयोग करके एक नया शुरू करने से पहले नवीनतम पर, (उसी उपयोगकर्ता के रूप में) कुछ ऐसा करें

if [ -e $somewhere/myjava.pid ] && ps -p $(cat $somewhere/myjava.pid) >/dev/null
then kill $(cat $somewhere/myjava.pid); rm -f $somewhere/myjava.pid; fi
# the default signal (TERM) is usually enough for Java, but if not
# (perhaps after a brief wait) use something stronger like -KILL

यदि कोई और जावा चला रहा है, तो यह विधि उनकी उपेक्षा करती है। यदि आप अपने स्वयं के कई जावा प्रक्रियाएँ चाहते हैं, तो अलग फ़ाइलनाम निर्दिष्ट करें। यदि आपके पास इतने सारे (शायद सैकड़ों) हैं कि अलग-अलग फ़ाइलनाम काम नहीं करते हैं, तो आपको एक कठिन समस्या है।


तो अगर मैं जावा शुरू करता हूँ तो मैं java.pid की तलाश करूँगा? लेकिन समय के साथ-साथ कई java.pids हो सकते हैं, तो मुझे कैसे पता चलेगा कि मैं किसको मारना चाहता हूं? क्या कोई प्रक्रिया 'PID को मैन्युअल रूप से चलाने के रूप में जल्द ही रिकॉर्ड करने का एक तरीका है, भले ही एक ही नाम के साथ पहले से ही कई प्रक्रियाएं हों?
कॉसिंगउंडरफ्लोव्सवरी

@CausingUnderflowsEverywhere विवरण जोड़ा गया
dave_thompson_085

अरे वाह नीरव, तो $! अंतिम पृष्ठभूमि नौकरी के पीआईडी ​​को संग्रहीत करता है। यह वही लगता है जो मुझे चाहिए। मुझे नोहाप या डिसऑर्डर की भी आवश्यकता हो सकती है क्योंकि जावा सर्वर लॉन्च करने के बाद पैरेंट बैश / टर्मिनल की मृत्यु हो जाती है।
कौंसिंगउंडरफ्लोव एवरीवेयर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.