क्रमिक रूप से दो बाल प्रक्रियाएं बनाने के लिए मैं किन आदेशों का उपयोग करूंगा?


8

मैं दो बच्चे की प्रक्रिया को स्पॉन करना चाहता हूं, लेकिन जब तक कि इसके निष्पादन में पहले एक निश्चित बिंदु तक नहीं पहुंच जाता है तब तक प्रतीक्षा करें (जो स्टडआउट की जांच करके निर्धारित किया जा सकता है) दूसरे को स्पैन करने से पहले। मुझे यकीन नहीं है कि कौन से यूनिक्स कमांड इसे पूरा करने में शामिल होंगे, और यूनिक्स कमांड नामों के ट्रिक और कभी-कभी गूढ़ प्रकृति के कारण Google के माध्यम से कुछ भी खोजने में एक कठिन समय था।

मैं उस विशिष्ट समस्या का हल नहीं ढूंढ रहा हूँ जिसे मैं हल करने की कोशिश कर रहा हूँ (हालाँकि किसी भी अतिरिक्त संकेत की सराहना की जाएगी), मैं मुख्य रूप से यह जानने के लिए चिंतित हूँ कि मैं किस यूनिक्स कमांड को देखना चाहता हूँ और उपयोग करना सीखता हूँ।


क्या आप पायथन का उपयोग करने के लिए खुले हैं?
xrisk

3
यह जानने के बिना कि आप "इसके निष्पादन में निश्चित बिंदु" कैसे निर्धारित करते हैं, यह बहुत अस्पष्ट है।
मूरू

@ मुरु ने स्पष्ट करने के लिए संपादन किया
w.brian

तो आपको वास्तव में 3 प्रक्रियाओं की आवश्यकता है। 1. रन, आउटपुट बनाना; 2. 1 के आउटपुट पर नज़र रखता है, और एक निश्चित बिंदु पर शुरू होता है। 3. यह पर्याप्त जानकारी है कि आप जो कुछ भी आप बना रहे हैं उसे शुरू करना है। लेकिन यह एक कार्यक्रम डिजाइन करने का एक अच्छा तरीका नहीं है।
djsmiley2kStaysInside

जवाबों:


7

आप इसके लिए xargsउपयोगिता का उपयोग कर सकते हैं । यह स्टड पर प्रत्येक पंक्ति के लिए एक कमांड चला सकता है, इसलिए हमें यह सुनिश्चित करने की आवश्यकता है कि xargsस्टड पर एक ही लाइन इनपुट के रूप में मिलती है जिस समय यह कमांड शुरू होनी चाहिए, जिसे पूरा किया जा सकता है grep:

proc1 | grep --max-count=1 "${targetString}" | xargs --max-lines=1 --no-run-if-empty --replace -- proc2

तर्कों --max-count=1, --max-lines=1और --no-run-if-emptyसुनिश्चित करें कि पहली proc2बार शुरू किया गया है अगर और जब पहली बार के लिए proc1आउटपुट ${targetString}, और अगर proc1कभी नहीं आउटपुट ${targetString}। जो --replaceबचता है, xargsवह इनपुट लाइन को उसकी कमांड लाइन में जोड़ता है।

मैंने इसका परीक्षण करने के लिए निम्न कमांड लाइन का उपयोग किया:

(echo Start >&2; sleep 3 ; echo Trigger; sleep 3; echo End >&2) | grep --max-count=1 Trigger | xargs --max-lines=1 --no-run-if-empty --replace -- echo "Triggered"

1
+1 यह एक बहुत ही रचनात्मक जवाब है। यदि आप proc1 से बाकी उत्पादन की जरूरत है, तो यह काफी अधिक जटिल हो जाएगा। आपको टी और अतिरिक्त फाइल डिस्क्रिप्टर या नामित पाइप जैसी चीजों का उपयोग करना होगा।
जो

7

मुझे यकीन नहीं है कि आपके द्वारा पूछे गए सवाल का एक सुरुचिपूर्ण आदेश / उत्तर है (अर्थात इसके निष्पादन में एक निश्चित बिंदु तक पहुंचें) - लेकिन ऐसे उपकरण / तकनीकें हैं जिनका उपयोग किसी समाधान को चकमा देने के लिए किया जा सकता है, जिसमें संभवतः 1 से अधिक शामिल हैं निम्नलिखित, और शायद अन्य चीजों के बारे में मुझे अभी तक पता नहीं है:

  1. पृष्ठभूमि प्रक्रियाओं (और)
  2. सशर्त निष्पादन और (&&) ||
  3. नींद
  4. प्रतीक्षा करें (मुझे उम्मीद है कि यह विशेष रूप से उपयोगी होगा - यदि आप पृष्ठभूमि में 1 से अधिक नौकरी लॉन्च करते हैं, तो यह तब तक इंतजार करेगा जब तक सभी नौकरियां पूरी नहीं हो जाती)
  5. नामित पाइप (जो प्रक्रियाओं के बीच बात करने के लिए एक तंत्र प्रदान कर सकता है)।
  6. inodenotifywait

लॉक फ़ाइलों को लिखना और जांचना भी आम बात है (प्रो टिप - अगर आपके पास पर्यावरण का नियंत्रण है, तो रैमडिस्क पर लिखें / tmp के बजाय - कई डिस्ट्रो पर यह / देव / shm है)।


6

यह सिर्फ एक विचार है, लेकिन पहली प्रक्रिया को इसके आउटपुट को grep में पाइप करना है। एक रीड लाइन लूप के लिए grep पाइप का आउटपुट लें, और प्रत्येक पंक्ति की तुलना उस चीज़ से करें जिसकी आप तलाश कर रहे हैं। एक बार मिलने के बाद, proc2 निष्पादित करें।

#!/bin/bash
targetString="line you are looking for"
proc1 | grep "${targetString}" |
while read line
do
if [ "$line" = "${targetString}" ]; then
    proc2
fi
done

यदि "इसके निष्पादन में एक निश्चित बिंदु" द्वारा निर्धारित किया जा सकता है stdout, तो निम्नलिखित के बारे में कैसे?

proc1 | grep "stdout trigger string" && proc2

&&grepरिटर्न करते समय आग लगना चाहिए 0, जो यह केवल तब करता है जब यह एक मैच पाता है।


1
स्ट्रेप बंद होने तक grep चलता रहेगा। यह तब तक कुछ भी (0 या अन्यथा) वापस नहीं करेगा।
बॉब

@ ओह ओह, धन्यवाद ... मैं इस विचार को फिर से समझने की कोशिश करूंगा।
लुई वावरू

@bob यह विशेष रूप से गन्दा और असंबद्ध होगा, और उपकरण का दुरुपयोग भी होगा, लेकिन आप एक लॉग फ़ाइल (यानी एक फाइल के लिए पाइप स्टडआउट) की निगरानी करने के लिए fail2ban का उपयोग कर सकते हैं, और फिर दूसरी पंक्ति को निष्पादित करने के लिए एक नियम प्रोग्राम करते हैं जब वह लाइन होती है पाया (लेकिन मैं एक ट्रिगर फ़ाइल को संशोधित कर रहा हूं और inotify का उपयोग करना एक अधिक सुरुचिपूर्ण समाधान है)
davidgo

1
अगर proc1 आउटपुट में एक से अधिक बार टारगेटिंग होती है, तो proc2 को कई बार चलाया जाएगा। यदि आप proc2 &और फिर break, ऐसा नहीं होता है, लेकिन यह पाइप को बंद कर देगा और proc1 को समय से पहले समाप्त कर देगा। वैकल्पिक रूप से, आप एक झंड़ा सेट कर सकते हैं जब proc2 शुरू हो जाता है और यह सुनिश्चित करने के लिए उपयोग करें कि proc2 फिर से नहीं चलाया जाए। अन्य उत्तर की तरह, proc1 आउटपुट के बाकी हिस्से को छोड़ दिया गया है, इसलिए यदि आपको इसकी आवश्यकता है, तो अधिक काम करना आवश्यक है।
जो

1
@ जोई गुड पॉइंट। मूल प्रश्न वास्तव में सिर्फ इस बारे में पूछ रहा था कि किन आदेशों के साथ काम करने के लिए उपलब्ध थे, इसलिए यह वास्तव में उन कमांडों की क्षमता (मुख्य रूप से |और grepयहां) में से कुछ को प्रदर्शित करने वाला एक उत्तर है ।
लुई वावरू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.