কোনও শেল স্ক্রিপ্ট থেকে কোনও বিশেষ বন্দর কোনও মেশিনে খোলা আছে কি না তা পরীক্ষা করে তার ভিত্তিতে কর্ম সম্পাদন করতে পারি?


24

আমি আমার নীচের শেল স্ক্রিপ্টটি এমন একটি মেশিনে চালাচ্ছি যার উপরে সি ++ অ্যাপ্লিকেশন সার্ভার 8080 পোর্টে চলছে এবং শেল স্ক্রিপ্টে আমি একটি ইউআরএল চালাচ্ছি এবং সেই URL থেকে আসা প্রতিক্রিয়াটি ডেটা ভেরিয়েবলের মধ্যে সঞ্চয় করি।

তবে ধরুন যদি একই অ্যাপ্লিকেশন সার্ভারটি নিচে থেকে থাকে তবে এটি ইউআরএল সম্পাদন করতে সক্ষম হবে না এবং তারপরে এটি প্রিন্ট করে Retrying Again30 সেকেন্ডের জন্য ঘুমাবে এবং তারপরে আবার একই ইউআরএল সম্পাদন করবে।

#!/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 সেকেন্ডের জন্য ঘুমাব sleep

/opt/app/test/start_stop.sh start

এটি কি আমার উপরের শেল স্ক্রিপ্টে করা সম্ভব?

আমি এই শেল স্ক্রিপ্টটি উবুন্টু 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তবে আমার প্রক্রিয়াটি যা ৮০৮০ বন্দরে চলছে তা কেন এমন হয়?
ডেভিড

এর আউটপুট কি netstat -tulpn | grep :8080?
ভোলকার সিগেল

নেটস্কেটের সাথে আমি এটিই পেয়েছি - 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
ডেভিড

আশ্চর্যের বিষয়, যদি আমি একই জিনিসগুলি চেষ্টা করি তবে এটি কাজ করে। IPv6 এর সাথে সম্পর্কিত হতে পারে ... hmmm।
ভোলকার সিগেল

এটি দিয়ে তালিকাভুক্ত করা হয় lsof -iTCP -sTCP:LISTEN | grep 8080?
ভোলকার সিগেল

16

বাশে সহজ উপায়। আপনার বন্দরটি খোলা থাকলে পরীক্ষা করুন Test

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

আপনি যা চান তার সাথে প্রতিধ্বনিকে প্রতিস্থাপন করুন।

অথবা আপনি এনসি ব্যবহার করতে পারেন।

nc -vz 127.0.0.1 8080

রিটার্নস:

127.0.0.1 8080 বন্দর [টিসিপি / *] এর সাথে সংযোগ সফল হয়েছে


1
ncআমার ব্যবহারের ক্ষেত্রে একটি দুর্দান্ত সমাধান; পরামর্শ দেওয়ার জন্য ধন্যবাদ
জন

1

আরজে-র উত্তরের বিবরণ দেওয়া যা কোন নোটগুলিও ncদরকারী ... ncতাড়াতাড়ি কমান্ড-লাইন অনুসন্ধানের জন্যই দরকারী নয়

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

তবে মানব-পঠনযোগ্যতা জিনিসটি যদি আপনার পরে না হয় তবে এটি ব্যবহার করা যায় - উদাহরণস্বরূপ, কোনও স্ক্রিপ্টে ব্যবহারের জন্য (বহির্গমন কোডটি বন্দরটি উন্মুক্ত বা বন্ধ কিনা তা নির্দেশ করবে)।

 nc -z 127.0.0.1 8080

 echo $?             
1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.