পিং সাফল্যের জন্য বাশ অপেক্ষা করুন


10

আমি একটি স্ক্রিপ্টে লিখছি যা বিভিন্ন সার্ভারকে পুনরায় চালু করে। পুনরায় বুটের পরে সমস্ত সার্ভারের অনলাইনে ফিরে না আসা পর্যন্ত আমি "অপেক্ষা" করতে চাই। (বিষয়গুলিকে সহজ রাখতে আমি অনলাইনে = সংজ্ঞাযোগ্য)

তাই প্রতিটি সার্ভারের জন্য আমি করি

ServerXY_W=1
echo -n "waiting for ServerXY ..."
while (($ServerXY_W == 1))
do
   if ping -c 1 -w 0.2 192.168.123.123 &> /dev/null
   then
      echo "ServerXY is back online!"
      ServerXY_W=0
   else
      echo -n "."
   fi
done

আমি যা প্রত্যাশা করব (এবং পছন্দ করি) তা যেমন একটি আউটপুট

waiting for ServerXY .................
ServerXY is back online!

যেখানে বিন্দু .... একের পর এক উপস্থিত হবে।

তবে আসলে যা ঘটে তা প্রথম সেখানে থাকে

waiting for ServerXY ...

কিছুক্ষণের জন্য এবং যখন সার্ভারটি ফিরে আসে তখন আমি শেষ বিন্দু এবং শেষ লাইনের মতো পাই

waiting for ServerXY ....
ServerXY is back online!

যখন লুপটি কেবল পিং ব্যর্থ হয়ে একবার এবং একবার পিং সাফল্যের সাথে দু'বার সম্পাদিত হয় কেন? লুপটিতে আরও ডট যুক্ত করতে আমার কী পরিবর্তন করতে হবে?

আমি অস্তিত্বহীন আইপি দিয়েও পরীক্ষাটি করেছিলাম। তবে এটি আটকে গেল

waiting for NonExistentServer...

এবং অবশ্যই অবসান হয় না। তবে একই প্রশ্নটি কেন যুক্ত হবে না ........?


আমার জন্য সূক্ষ্মভাবে কাজ করে ...: /
রাভেক্সিনা

উত্তর:


9

সমস্যাটি

সমস্যাটি আপনি সেট করেছেন -w 0.2। যখন মান 1 এর নীচে হয়, সময়সীমা ( -w) এবং সময়সীমা ( -W) মানগুলি অগ্রাহ্য করা হয়। এই প্রশ্নের আগে এটি উল্লেখ করা হয়েছে । আপনি যখন ব্যবহার করবেন তখন -w 1আপনার স্ক্রিপ্ট (যা আমি অকেজো বিটগুলি অপসারণ করতে সামান্য সংশোধন করেছি) সঠিকভাবে কাজ করে:

$ ./ping_server.sh                                                 
waiting for ServerXY ....................
Server is back online

$ cat ./ping_server.sh
#!/bin/bash
printf "%s" "waiting for ServerXY ..."
while ! ping -c 1 -n -w 1 147.153.237.192 &> /dev/null
do
    printf "%c" "."
done
printf "\n%s\n"  "Server is back online"

সমাধান

সুস্পষ্ট সমাধানটি ব্যবহার করা -w 1। যদি আপনি 1 সেকেন্ডের চেয়ে কম মান ব্যবহার করতে চান তবে timeoutকমান্ডটি আরও ভাল হওয়া উচিত:

$ timeout 0.2 ping -c 1 147.153.237.192                            
PING 147.153.237.192 (147.153.237.192) 56(84) bytes of data.
64 bytes from 147.153.237.192: icmp_seq=1 ttl=124 time=2.61 ms

--- 147.153.237.192 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 2.612/2.612/2.612/0.000 ms

আবার !এটি লুপটিতে অপারেটরের সাথে ব্যবহার করুন :

#!/bin/bash
printf "%s" "waiting for ServerXY ..."
while ! timeout 0.2 ping -c 1 -n 147.153.237.192 &> /dev/null
do
    printf "%c" "."
done
printf "\n%s\n"  "Server is back online"

অবশ্যই সার্ভারটি আপ থাকলে বার্তা প্রদর্শন করতে প্রয়োগ করা যেতে পারে এবং সার্ভার ডাউন হলে রিপোর্ট করা যায়, উদাহরণস্বরূপ:

$ while ping -q -c 1 172.16.127.2 >/dev/null ; do sleep 1; done ; echo "Server stopped responding"
Server stopped responding

তবে খেয়াল করুন, এটি নিখুঁত নয়:

  • আমরা প্রতি সেকেন্ডে মাত্র 1 প্যাকেট দিয়ে পিং করছি। লো ব্যান্ডউইদথ, দুর্বল সংযোগ, সার্ভার এবং ক্লায়েন্টের পিংয়ের মধ্যে থাকা হার্ড হার্ডওয়্যারটি লুপটি প্রস্থান করতে এবং মিথ্যা ইতিবাচক বিজ্ঞপ্তিটি তৈরি করবে

  • আমরা পিংংয়ের উপর নির্ভর করছি, এটি আইসিএমপি ইকো ব্যবহার করছে। ফায়ারওয়ালস এমনকি স্বতন্ত্র সার্ভারগুলি পিং / আইসিএমপি প্রতিধ্বনির প্রতিক্রিয়াগুলিকে অবরুদ্ধ করে। আপনি ব্যবহার করতে পারে ncএর ncat(এর একটি উন্নত সংস্করণ যা nc)। উপরের লুপের মতো কিছু ঠিকঠাক পরিবর্তে কাজ করবে ping:

    nc -w5 -z 172.16.127.2 80

    এটি যা করবে তা 802 পোর্টের 172.16.127.2 এ সার্ভারের সাথে সংযুক্ত রয়েছে -zI I / O এড়ানো - কেবল সংযোগ স্থাপন এবং সংযোগ বিচ্ছিন্ন করা। -wব্যর্থ সংযোগের রিপোর্ট করার আগে 5 সেকেন্ড অপেক্ষা করতে হবে। অবশ্যই যখন আপনি আপনার নিয়ন্ত্রণে থাকা সার্ভার রাখেন এবং আপনি জানেন যে 80 বন্দরটি উন্মুক্ত রয়েছে এটি অবশ্যই বেশ ভাল। ইউপিডি সূক্ষ্মভাবে ব্যবহার করা যেতে পারে, তবে জায়গায় ফায়ারওয়াল থাকলে, টিসিপি সম্ভবত পছন্দনীয়।

    এখানে একটি গোপন সুবিধা হ'ল যদি আপনার নির্দিষ্ট বন্দরটিতে কিছু পরিষেবা চলমান থাকে (যেমন 80 র বন্দরের HTTP বা 554-তে RTSP), পোর্টের সাথে সংযোগ স্থাপনে ব্যর্থ হতে পারে তবে আপনার পরিষেবাটি পুনরায় আরম্ভের প্রয়োজন।

  • অবশ্যই, ncএবং pingকিছুটা স্প্যামিও হতে পারে। আরও ভাল উপায় হ'ল অন্য কেন্দ্রীয় সার্ভারের সাথে সার্ভার চেক-ইন করা, পর্যায়ক্রমিক প্রতিবেদন পাঠানো, সম্ভবত প্রতি ঘন্টা; যদি আপনার সার্ভার কোনও "পাঞ্চ সময়" মিস করে তবে আপনি ত্রুটি তৈরি করতে পারেন। নাগিওসের মতো পরিষেবা ব্যবহার করা সবচেয়ে ভাল উপায় which তবে এই মুহুর্তে আমরা একাধিক সার্ভারের সাথে এন্টারপ্রাইজ-স্তরীয় কম্পিউটিংয়ের ক্ষেত্রের মধ্যে চলেছি। আপনার যদি বাড়িতে রাস্পবেরি পাই এর মতো কিছু থাকে তবে আপনার সম্ভবত জটিল কিছু দরকার নেই।


হাই-কে এই বিষয়টিকে সাফ করার জন্য আপনাকে অনেক ধন্যবাদ! লুপ অবস্থায় এটি করার চেয়ে আলাদা উপায় আছে কি? এটি একটি সার্ভারের জন্য অপেক্ষা করার জন্য নিখুঁত তবে উল্লিখিত হিসাবে আমি একাধিক সার্ভারের পরে অপেক্ষা করছি আইল্ড এমন কিছু করব while (( $ServerA_W==1 || $ServerB_W==1 || .....))যা প্রতিটি সার্ভার ফিরে আসার পরে রাখে।
derHugo

উদাহরণস্বরূপ, একটি সার্ভার আবার অন্যদের জন্য অপেক্ষা করছে যা আমি ইতিমধ্যে ফিরে আসার জন্য পিং করতে চাই না;)
derHugo

আমি ফাংশন হিসাবে লিখতে এবং পটভূমিতে আর্গুমেন্ট হিসাবে আইপি ঠিকানার সাথে প্রতিটি ফাংশনের উদাহরণ চালু করার পরামর্শ দেব তবে আমি বিন্দুগুলি মুদ্রণের বিরুদ্ধে সুপারিশ করব, সার্ভারটি উপস্থিত হলে প্রতিটি ফাংশন মুদ্রণ বার্তাটি দেয়। আপনি যদি আমাকে এই জাতীয় ফাংশনের উদাহরণ লিখতে চান তবে আমাকে জানান
সের্গেই কোলডিয়াজনি

1
@ জোয়ান হ্যাঁ, এটি সম্ভব। আমি আমার উত্তরটি আজ বা কাল পরে আপডেট করতে পারি। ব্যক্তিগতভাবে, আমি সার্ভারটি অল্প স্প্যামি হিসাবে অবিচ্ছিন্নভাবে পিং করব না, যদিও
সের্গি কোলোডিয়াজহনি

1
@ জোয়ান উত্তরে আমার আপডেটগুলি দেখুন। এটি আমাকে সহায়তা করে কিনা বা অন্য কোনও প্রশ্ন থাকলে তা আমাকে জানান
সের্গি কলডিয়াজহনি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.