कैसे जांच करें कि शेल स्क्रिप्ट से एक मशीन पर एक विशेष पोर्ट खुला है और उसके आधार पर कार्रवाई करना है?


24

मैं अपना निचला शेल स्क्रिप्ट एक मशीन पर चला रहा हूं, जिस पर c ++ एप्लिकेशन सर्वर 8080 पोर्ट पर चल रहा है और शेल स्क्रिप्ट में मैं एक URL निष्पादित कर रहा हूं और उस URL से DATA वेरिएबल में आने वाले रिस्पॉन्स को स्टोर करता हूं।

लेकिन मान लें कि यदि वही ऐप सर्वर डाउन है, तो वह URL को निष्पादित नहीं कर पाएगा और फिर यह प्रिंट आउट Retrying Againऔर 30 सेकंड के लिए सो जाएगा और फिर उसी url को फिर से निष्पादित करेगा।

#!/bin/bash

HOSTNAME=$hostname
DATA=""
RETRY=15

echo $HOSTNAME

while [ $RETRY -gt 0 ]
do
    DATA=$(wget -O - -q -t 1 http://$HOSTNAME:8080/beat)
    if [ $? -eq 0 ]
    then
        break
    else
        echo "Retrying Again" >&2

        # restart the server

        let RETRY-=1
        sleep 30
    fi
done

echo "Server is UP"

और यहां HOSTNAMEसर्वर का स्थानीय होस्टनाम है, जिस पर मैं अपनी उपरोक्त शेल स्क्रिप्ट चला रहा हूं।

समस्या का विवरण:-

अब मैं क्या करने की कोशिश कर रहा हूं, यदि सर्वर डाउन है, तो यह प्रिंट आउट होगा, उसके Retrying Againबाद मैं जांचना चाहता हूं कि पोर्ट 8080खोला गया है $HOSTNAMEया नहीं। यदि नहीं, तो इसका मतलब है कि सर्वर डाउन है इसलिए मैं इस कमांड को निष्पादित करके सर्वर को पुनरारंभ करना चाहता हूं और फिर शेल स्क्रिप्ट में ऊपर दिखाए गए अनुसार 30 सेकंड के लिए सो जाओ।

/opt/app/test/start_stop.sh start

क्या यह मेरे ऊपर की शेल स्क्रिप्ट में यहाँ संभव है?

मैं इस शेल स्क्रिप्ट को Ubuntu 12.04 पर चला रहा हूं।

जवाबों:


23

कार्यक्रम lsofआपको यह जांचने की अनुमति देता है कि कौन सी प्रक्रियाएं फाइलों या बंदरगाहों की तरह कौन से पुर्जे का उपयोग कर रही हैं।

यह दिखाने के लिए कि पोर्ट 8080 पर कौन सी प्रक्रियाएं सुन रहे हैं:

lsof -Pi :8080 -sTCP:LISTEN

आपके मामले में, आप परीक्षण करना चाहते हैं कि क्या कोई प्रक्रिया 8080 पर सुन रही है - इस कमांड का रिटर्न मान आपको बस यही बताता है। यह प्रक्रिया के पृष्ठ को भी प्रिंट करता है।

lsof -Pi :8080 -sTCP:LISTEN -t

यदि आपको केवल परीक्षण की आवश्यकता है, जिसमें कोई आउटपुट नहीं है, तो इसे /dev/nullनिम्न पर पुनर्निर्देशित करें :

if lsof -Pi :8080 -sTCP:LISTEN -t >/dev/null ; then
    echo "running"
else
    echo "not running"
fi


यदि आप स्थानीय रूप से एकाधिक आईपी पते के साथ कई होस्ट नामों का उपयोग करते हैं, तो होस्टनाम भी पसंद करें
lsof -Pi @someLocalName:8080 -sTCP:LISTEN


धन्यवाद वोल्कर। मैंने यह कोशिश की lsof -i :8080 -sTCP:LISTENऔर मुझे कंसोल पर कुछ भी नहीं मिल रहा है लेकिन अगर मैं यह कोशिश कर netstat -tulpn | grep :8080रहा हूं तो मुझे मेरी प्रक्रिया मिलती है जो कि 8080 पोर्ट पर चल रही है ऐसा क्यों है?
डेविड

का आउटपुट क्या है netstat -tulpn | grep :8080?
वोल्कर सेगेल

यह मुझे netstat - david@machineA:/home/david$ netstat -tulpn | grep :8080 (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 27530/test_server
david

अजीब, अगर मैं इसी तरह की चीजों की कोशिश करता हूं तो यह काम करता है। IPv6 से संबंधित हो सकता है ... हम्म।
वोल्कर सेगेल

इसके साथ सूचीबद्ध है lsof -iTCP -sTCP:LISTEN | grep 8080?
वोल्कर सेगेल

16

बैश में सबसे सरल तरीका। अगर आपका पोर्ट खुला है तो टेस्ट करें।

(echo >/dev/tcp/localhost/8080) &>/dev/null && echo "TCP port 8080 open" || echo "TCP port 8080 close"

आप जो चाहते हैं उसके साथ प्रतिध्वनि बदलें।

या आप nc का उपयोग कर सकते हैं।

nc -vz 127.0.0.1 8080

यह दिखाता है:

127.0.0.1 8080 पोर्ट [tcp / *] का कनेक्शन सफल रहा


1
ncमेरे उपयोग के मामले के लिए एक महान समाधान है; सुझाव के लिए धन्यवाद
जॉन

1

आरजे के जवाब पर विस्तृत जो नोट करता है nc उपयोगी है ... न केवल ncत्वरित कमांड-लाइन क्वेरी के लिए उपयोगी है

 nc -z -v -w5 127.0.0.1 8080
localhost [127.0.0.1] 8080 (http-alt) : Connection refused

लेकिन इसका उपयोग बिना -v के किया जा सकता है, यदि मानव-पठनीयता वह चीज नहीं है जो आप बाद में हैं - जैसे, स्क्रिप्ट में उपयोग के लिए (निकास कोड इंगित करेगा कि पोर्ट खुला है या बंद है)।

 nc -z 127.0.0.1 8080

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