पोर्ट पर अनुरोध स्वीकार करने की प्रक्रिया शुरू करने के लिए मैं एक स्क्रिप्ट कैसे बताऊं?


33

मुझे एक कमांड की आवश्यकता है जो एक विशिष्ट पोर्ट पर अनुरोधों को स्वीकार करने के लिए एक प्रक्रिया की प्रतीक्षा करेगा।

क्या लिनक्स में ऐसा कुछ है जो ऐसा करता है?

while (checkAlive -host localhost -port 13000 == false)
  do some waiting

...

जवाबों:


52

एक सर्वर कनेक्शन स्वीकार कर रहा है या नहीं यह देखने के लिए सबसे अच्छा परीक्षण वास्तव में कनेक्ट करने का प्रयास करना है। आपके सर्वर ने जो भी प्रोटोकॉल बोला है उसके लिए एक नियमित क्लाइंट का उपयोग करें और नो-ऑप कमांड का प्रयास करें।

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

while ! echo exit | nc localhost 13000; do sleep 10; done

आप कनेक्शन स्थापित करने के बाद बाहर निकलने के लिए नेटकैट भी बता सकते हैं। यदि कनेक्शन नहीं है तो यह 1 लौटाता है और यदि ऐसा है तो हम इसके आउटपुट को नकार देते हैं। Netcat के आपके संस्करण के आधार पर, यह निम्नलिखित में से एक या दोनों आदेशों का समर्थन कर सकता है:

while ! nc -z localhost 13000 </dev/null; do sleep 10; done
while ! nc -q 1 localhost 13000 </dev/null; do sleep 10; done

एक वैकल्पिक दृष्टिकोण एक सुनने का सॉकेट खोलने के लिए सर्वर प्रक्रिया की प्रतीक्षा करना है।

while netstat -lnt | awk '$4 ~ /:13000$/ {exit 1}'; do sleep 10; done

यदि आप Mac OS पर हैं, तो netstat थोड़ा अलग आउटपुट स्वरूप का उपयोग करता है, इसलिए आप निम्नलिखित जानकारी चाहते हैं:

while netstat -lnt | awk '$4 ~ /\.13000$/ {exit 1}'; do sleep 10; done

या आप एक विशिष्ट प्रक्रिया आईडी को लक्षित करना चाह सकते हैं:

while ! lsof -n -Fn -p $pid | grep -q '^n.*:13000$'; do sleep 10; done

मैं सॉकेट को सुनने के लिए शुरू होने वाली प्रक्रिया पर प्रतिक्रिया करने के लिए किसी भी तरीके के बारे में नहीं सोच सकता (जो कि एक मतदान दृष्टिकोण से बचना होगा) का उपयोग करने से कम ptrace


मुझे लगता है कि netcat जवाब है, इसलिए धन्यवाद। स्पष्ट करने के लिए, जो मैं करने की कोशिश कर रहा हूं, वह एक स्क्रिप्ट है जो लोड संतुलन प्रक्रिया के भाग के रूप में लिखी जाती है। मुझे एक प्रक्रिया शुरू करने की आवश्यकता है, इसके लिए पोर्ट पर अनुरोध स्वीकार करने की प्रतीक्षा करें और फिर मूल बंद करें। यदि मेरी स्वयं की पटकथा लिखने के बजाय, ऐसा करने के बेहतर तरीके हैं, तो मैं सभी कानों के पास हूं।
होगा

@Will: यह एक बहुत अलग सवाल है! मैंने एक अलग उत्तर लिखा है।
गिल्स एसओ- बुराई को रोकना '

1
मुझे नेटकाट समाधान भी पसंद है। मेरे पास स्क्रिप्ट का उपयोग है nc -w 2 </dev/null >/dev/null- यदि कनेक्शन 2 सेकंड से अधिक समय लेता है, तो यह समय से बाहर हो जाता है और विफल रहता है - जो मेरे उपयोग के लिए आसान है।
१०:१० तक

FYI करें, मुझे 'nc -q 1 लोकलहोस्ट 13000 </ dev / null जबकि नहीं मिल सकता है; 10 सो जाओ; किया 'काम करने के लिए एक। यह बस तुरंत लौटता है। पहला हालांकि ठीक काम करता है। धन्यवाद!
एलिस पेर्सिवल

@ nc -q 1 localhost 13000 </dev/nullकोई सर्वर नहीं सुन रहा है, तो तुरंत वापस आ जाता है, लेकिन यह एक त्रुटि कोड के साथ लौटता है, इसलिए लूप इसे सोता है और कुछ सेकंड बाद फिर से कोशिश करता है।
गिल्स एसओ- बुराई को रोकना '

17

यदि आपके पास बैश और कोरुटिल्स हैं (उदाहरण के लिए टाइमआउट, स्लीप), लेकिन nc / lsof / netstat नहीं, तो आप इस समाधान का उपयोग कर सकते हैं जो बैश मैजिक tcp सॉकेट का उपयोग करता है:

while ! timeout 1 bash -c "echo > /dev/tcp/localhost/13000"; do sleep 10; done

विस्तृत करने के लिए, बैश में "नेटवर्क रिडायरेक्शन" - gnu.org/software/bash/manual/html_node/…
johntellsall

7

टीसीपी सॉकेट्स जादू के साथ पिछले उदाहरण के बाद bash, यहां एक बढ़ाया संस्करण है जो सीमित समय के दौरान कनेक्शन की प्रतीक्षा करता है।

timeout 15 bash -c 'until echo > /dev/tcp/localhost/13000; do sleep 0.5; done'

अंतर यह है कि यदि कनेक्शन के दौरान उपलब्ध नहीं था 15s , - यह हमेशा के लिए लूप नहीं करेगा, लेकिन त्रुटि कोड के साथ बाहर निकल जाएगा।

स्टार्टअप के बाद सेवा की तत्परता / उपलब्धता की प्रतीक्षा करने के लिए यह init स्क्रिप्ट के लिए उपयोगी है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.