मैं एक शेल स्क्रिप्ट कैसे बनाऊं जो आउटपुट को एक प्रक्रिया में भेजती है


11

मैं वर्तमान में एक स्क्रीन में सर्वर कंसोल प्रोग्राम चला रहा हूं क्योंकि मुझे इसे पढ़ने और कभी-कभार कमांड भेजने की आवश्यकता है।

मैं पृष्ठभूमि में डेमॉन के रूप में ऐप को चलाना चाहता हूं (प्रारंभ करें / इसे init से रोकें)।

मैं tail -fलॉग कर सकता था, लेकिन वह मुझे प्रक्रिया में इनपुट भेजने नहीं देगा।

क्या इसे स्थापित करने का कोई तरीका है ताकि मैं दोनों पढ़ और इनपुट भेज सकूं, लेकिन फिर भी यह पृष्ठभूमि में चल रहा है?

मैं विभिन्न प्रक्रियाओं से डेमॉन को इनपुट भेजने में सक्षम होना चाहता हूं (एक शेल स्क्रिप्ट जो "स्टॉप \ n" कमांड भेज सकता है, उदाहरण के लिए)।


इसे पढ़ने के लिए आने वाले किसी व्यक्ति के लिए बस एक टिप्पणी - यहां जवाब शानदार है। यदि आप नामित पाइपों के बारे में नहीं जानते हैं तो मैं आपको कम से कम उन्हें एक कोशिश देने की सलाह देता हूं। इसके उपयोग से मैं Minecraft को एक सेवा के रूप में चला सकता हूं और नामित पाइप पर लिखकर अन्य लिपियों से कंसोल के साथ बातचीत कर सकता हूं - इसलिए सर्वर को रोकने के लिए स्क्रिप्ट लिखना, उपयोगकर्ताओं को संदेश भेजना आदि संभव है, जबकि आउटपुट लॉग को पार्स करते हुए मुख्य लाइनों की तलाश करें (जैसे कि किसी उपयोगकर्ता को उनके द्वारा भेजे गए चैट संदेश भेजना)
बिल के

जवाबों:


9

एक पाइप से पढ़ें, एक फ़ाइल पर लिखें

यदि आप चाहते हैं कि डेमॉन कुछ मनमानी प्रक्रिया द्वारा निर्मित इनपुट को पढ़ें, तो आपको उस प्रक्रिया को एक पाइप से कनेक्ट करना होगा। यहां मनमानी प्रक्रिया आप कमांडों को गूंज रहे हैं, और यह एक अलग संदर्भ में चलने वाला है। इसलिए एक नामित पाइप बनाएं (जिसे अक्सर यूनिक्स संदर्भों में फीफो कहा जाता है)।

mkfifo /var/run/daemon.fifo
</var/run/daemon.fifo /path/to/daemond --option >daemon.log

और बस पाइप पर कमांड लिखें:

echo 'FORWARD 10' >/var/run/daemon.fifo
echo 'LEFT 72' >/var/run/daemon.fifo

हालांकि यह काम करने की संभावना नहीं है, हालांकि: एक अच्छा मौका है कि डेमन बाहर निकल जाएगा जब वह अपने मानक इनपुट पर फ़ाइल का अंत देखता है, जो कि पाइप को लिखने वाली पहली प्रक्रिया जैसे ही होता है। आप tail -fउस समस्या से बचने के लिए उपयोग कर सकते हैं ।

</var/run/daemon.fifo tail -c +1 -f | {
  echo $$ >/var/run/daemon.pid
  exec /path/to/daemond --option >daemon.log
}

कुछ tailकार्यान्वयन के साथ , आपको बफरिंग द्वारा काट लिया जा सकता है: tailप्रक्रिया तब तक प्रतीक्षा करेगी जब तक कि यह कुछ आउटपुट उत्सर्जित करने के लिए पर्याप्त बाइट्स नहीं जमा कर ले। मुझे नहीं लगता कि यह POSIX टूलबॉक्स में हल करने योग्य है; यदि यह समस्या है, तो एक तुच्छ C या पर्ल या पायथन प्रोग्राम का उपयोग करें। जहां तक ​​मैं tailजीएनयू कोर्यूटिल्स से कह सकता हूं (जैसा कि लिनक्स और अन्य जगहों पर पाया जाता है) इस सम्मान पर सुरक्षित है।

जब आप डेमन को रोकते हैं, echo >/var/run/daemon.fifoतो tailप्रक्रिया को मार देगा ।


स्क्रीन के अंदर कार्यक्रम शुरू करना

अपने सेवा प्रबंधक से सीधे डेमन को आमंत्रित करने के बजाय (क्या आप वास्तव में सिर्फ SysV init का उपयोग कर रहे हैं, या कुछ अतिरिक्त जैसे रैपर स्क्रिप्ट या अपस्टार्ट?), आह्वान करते हैं।

screen -c daemon.screenrc -L -d -m -S daemon_name /path/to/daemond --option

चूंकि डेमन सेवा प्रबंधक की बाल प्रक्रिया नहीं होगी, इसलिए आपको सही प्रक्रिया के लिए एक संकेत भेजने के लिए सुनिश्चित करना होगा। यह कैसे करना है कि वास्तव में डेमन कैसे शुरू होता है और किस पर निर्भर करता है।

यह तकनीकी रूप से संभव एक टर्मिनल के लिए किसी चल प्रक्रिया संलग्न करने के लिए है, लेकिन वहाँ एक जोखिम आप इस कार्यक्रम दुर्घटना होगी, तो यह एक उत्पादन प्रणाली के लिए बाहर निश्चित रूप से है।

-Lविकल्प स्क्रीन लिखने सब कुछ है कि एक फाइल करने के लिए अपने विंडो में दिखाई देता बनाता है। निर्देश के daemon.screenrcसाथ फ़ाइल का नाम दिया गया है logfile


वास्तव में, मैं वास्तव में एक स्क्रिप्ट से संदेश भेजने में सक्षम होना चाहता हूं - शायद यही सवाल मुझसे पूछा जाना चाहिए। वर्तमान में मैं सिर्फ एक स्क्रिप्ट से सर्वर चला रहा हूं और इसे टर्मिनल में टाइप करने में सक्षम हूं, लेकिन ऐसा लगता है कि इसे एक सेवा के रूप में चलना चाहिए ...
बिल K

@ बिल: ठीक है, मैं देख रहा हूँ। फिर पहली बात जो मेरे दिमाग में आती है, वह एक नामित पाइप है।
गाइल्स का SO- दुष्ट होना बंद करो '

मुझे लगता है कि यह वही है जो मुझे @Gilles चाहिए! मुझे हालांकि इसे बेहतर ढंग से समझने की जरूरत है। मैं इसे जानने के लिए मैन पेजों के माध्यम से छांटने में कुछ समय बिताऊंगा - मुझे ईमानदारी से बहुत कम मिलता है (मुझे सबसे ज्यादा वही मिलता है जो आप कर रहे हैं और लगभग आपने जो भी किया, उसमें से कोई भी नहीं - और मुझे लगा कि मैं एक तरह का था। इस सामान के साथ सुराग।) मेरा सिद्धांत प्रक्रिया से सीधे जुड़ना नहीं था, लेकिन अभी तक एक और स्क्रिप्ट बनाने के लिए है जो कि i / o से जुड़कर deamons o / i में बना है, ऐसा लगता है जैसे मूल कंसोल चल रहा है, लेकिन क्षमता के साथ एक ही समय में एक अन्य स्क्रिप्ट से 'फॉरवर्ड 10' की गूंज करने के लिए।
बिल K

मुझे लगता है कि मुझे इसका बहुत फायदा मिला है। अगर मैं इसे तोड़ता हूं तो मुझे अब "mkfifo पाइप" और "पूंछ -f पाइप | कमांड> आउटपुट" समझ में आता है, उन लोगों का परीक्षण किया और वे काम करते हैं। मुझे लगता है कि आपके पास एक लाइन पर चलने के लिए आपके पास मौजूद अन्य सामानों में से अधिकांश - क्या मैं किसी भी महत्वपूर्ण चीज़ को याद कर रहा हूं?
बिल K

@ बिल: आप बाहर (स्क्रीन की stuffकमांड का उपयोग करके) स्क्रीन के अंदर टर्मिनल को लिख सकते हैं । लेकिन आपको यहां टर्मिनल के ओवरहेड (प्रसंस्करण, लेकिन सबसे महत्वपूर्ण रूप से संज्ञानात्मक) की आवश्यकता नहीं है, एक पाइप लगभग पर्याप्त है (यह एक छोटे से अंत-फ़ाइल-अनदेखी रिले प्रक्रिया के साथ पर्याप्त है)। आप एक टर्मिनल के साथ <fifo catया दूसरे टर्मिनल में थोड़ा प्रयोग करना चाह सकते हैं ; मुझे लगता है कि तुम ठीक हो जाओगे। <fifo tail -f | catecho >fifo; echo >fifo
गिल्स एसओ- बुराई को रोकना '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.