হোস্টটি পরিচিত না হওয়া পর্যন্ত কীভাবে লিনাক্সে পিং করবেন?


46

আমি কীভাবে একটি নির্দিষ্ট ঠিকানা পিং করতে পারি এবং যখন খুঁজে পাওয়া যায়, তখন পিং করা বন্ধ করুন।

আমি এটি ব্যাশ স্ক্রিপ্টে ব্যবহার করতে চাই, সুতরাং হোস্টটি যখন শুরু হবে তখন স্ক্রিপ্টটি পিংগিং চালিয়ে যায় এবং হোস্টটি উপলব্ধ হওয়ার মুহুর্ত থেকে স্ক্রিপ্টটি চালিয়ে যায় ...

উত্তর:


84

মার্টিনাসের উত্তরের আরও সরলীকরণ:

until ping -c1 www.google.com >/dev/null 2>&1; do :; done

নোট করুন যে পিং নিজেই লুপ পরীক্ষা হিসাবে ব্যবহৃত হয়; এটি সফল হওয়ার সাথে সাথে লুপটি শেষ হয়। লুপের দেহটি শূন্য, নাল কমান্ডের সাথে :একটি সিনট্যাক্স ত্রুটি রোধ করতে ব্যবহৃত হয়।

আপডেট: আমি কন্ট্রোল-সিটিকে পিং লুপটি পরিষ্কারভাবে প্রস্থান করার উপায়ের কথা ভেবেছিলাম। এটি পটভূমিতে লুপটি চালাবে, বিঘ্নিত (কন্ট্রোল-সি) সংকেতটি আটকাবে এবং ব্যাকগ্রাউন্ড লুপটি ঘটলে তা মেরে ফেলবে:

ping_cancelled=false    # Keep track of whether the loop was cancelled, or succeeded
until ping -c1 "$1" >/dev/null 2>&1; do :; done &    # The "&" backgrounds it
trap "kill $!; ping_cancelled=true" SIGINT
wait $!          # Wait for the loop to exit, one way or another
trap - SIGINT    # Remove the trap, now we're done with it
echo "Done pinging, cancelled=$ping_cancelled"

এটি কিছুটা সার্কিটাস, তবে আপনি যদি লুপটি বাতিলযোগ্য হতে চান তবে এটি কৌশলটি করা উচিত।


6
'ঘুম' যুক্ত করতে (উদাহরণস্বরূপ প্রতি 5 সেকেন্ড): যখন! পিং -c1 www.google.com &> / dev / নাল; ঘুমো 5; সম্পন্ন
লিপ

4
ডিফল্টরূপে pingএর পিং ছাড়ার আগে 10 সেকেন্ড অপেক্ষা করবে। আপনি যদি এটি 1 সেকেন্ডে কমাতে চান তবে আপনি ব্যবহার করতে পারেন -w1
জ্যাক ও'কনোর

2
@ জ্যাকও'কনর বিএসডি পিং ব্যবহার করে, এটি একটি রাজধানী-W1
লুক

এই উত্তরটির সাথে আমার একমাত্র সমস্যা হ'ল এটি সাইনটি ভালভাবে পরিচালনা করে না। আপনি কমান্ড লাইন থেকে এটি থামাতে অক্ষম, যদি এটি যে কোনও কারণেই কখনও সংযুক্ত না হয়।
লুক এক্সন

@ লুকেক্সটনের জন্য এটি বাশ এবং পিংয়ের চিহ্নগুলি হ্যান্ডেলগুলি পরিচালনা করার পদ্ধতি এবং তারা কীভাবে ইন্টারঅ্যাক্ট করে ( এই প্রশ্নটি দেখুন ) এর কারণেই এটি । আমার খুব ভাল সমাধান নেই, তবে একটি ক্লুজ রয়েছে: স্ক্রিপ্টটি থামাতে কন্ট্রোল-জেড ব্যবহার করুন, তারপরে kill %1এটি হত্যা করুন।
গর্ডন ডেভিসন

25

আপনি একটি লুপ করতে পারেন, একটি পিং প্রেরণ করুন এবং স্থিতির উপর নির্ভর করে লুপটি ভাঙ্গুন, উদাহরণস্বরূপ (বাশ):

while true; do ping -c1 www.google.com > /dev/null && break; done

এটি আপনার স্ক্রিপ্টে কোথাও রেখে দেওয়ার সময় অবরুদ্ধ হয়ে যাবে, যতক্ষণ না www.google.comপিংযোগ্য।


2
এটি while trueএবং breakক্লিনার সমাধান, আইএমও।
ড্যান কারলি

1
@ ড্যানকারলি আমি এই কারণে আপনার সাথে একমত নই যে স্বীকৃত উত্তরে নাল কমান্ড সংস্করণটি আপনার ঘুমের পরিবর্তে / আপনার সিপিইউকে বিরতি দেওয়ার জন্য অপেক্ষা করতে পারে এবং এই ক্ষেত্রে আমি এটিকে ক্লিনার সলিউশন বলব। এই উত্তরের সাথে অন্য সমস্যাটি হ'ল এটির জন্য পাঠক / ব্যবহারকারীর বুঝতে হবে যে কীভাবে && কাজ করে এবং কীভাবে যদি প্রথম কমান্ড ব্যর্থ হয় তবে এটি কল করা হবে না। এটি আপনার নিজের মত একটি মতামত।
হামিদ

1
আমি এই সমাধান এবং গৃহীত সমস্যার মধ্যে যে প্রধান তফাতটি দেখতে পাচ্ছি তা হ'ল এটি একটি ত্রুটি বার্তাটি "অজানা হোস্ট ..." সন্ধান না হওয়া পর্যন্ত প্রতিধ্বনিত করবে। যোগ করার জন্য ঘুম : (যেমন প্রতিটি 5 সেকেন্ড)while true; do sleep 5; ping ...
Lepe

20

আমি জানি প্রশ্নটি পুরানো ... এবং বিশেষভাবে সম্পর্কে জিজ্ঞাসা করে ping, তবে আমি আমার সমাধানটি ভাগ করতে চেয়েছিলাম।

হোস্টগুলি রিবুট করার সময় আমি কখনই তাদের মধ্যে এসএসএইচ করতে পারি তা জানতে আমি এটি ব্যবহার করি। (যেহেতু শুরু pingহওয়ার আগে কয়েক সেকেন্ডের জন্য প্রতিক্রিয়া জানানো হবে sshd))

until nc -vzw 2 $host 22; do sleep 2; done

2
আমি ঠিক এটিই অনুসন্ধান করেছি, ধন্যবাদ! এমনকি আপনি সিটিআরএল + সি দিয়ে কলটিও বাধাগ্রস্ত করতে পারেন যা এই থ্রেডের কিছু অন্যান্য সমাধানের ক্ষেত্রে নয়।
অ্যালেক্স

1
নোট করুন এটি নেটকাটের বিএসডি সংস্করণগুলির জন্য কাজ করে। লিনাক্স ডিস্ট্রোজে nmap.org সংস্করণটি আলাদাভাবে প্রয়োগ করা হয়েছে, সুতরাং -z বিকল্পটি বিদ্যমান নেই এবং -w বিকল্পটি সংযোগের জন্য অপেক্ষা করে তবে সফল হলে বন্ধ হয় না। যদিও ওএসএক্সে দুর্দান্ত কাজ করে।
পল

এজন্য আপনি প্রথম (সূক্ষ্ম) উত্তরে থামবেন না। এটিই আসল সমস্যার উত্তর ।
লিও

11

লক্ষ্য হোস্ট একবার পিং। পিংটি সফল হয়েছে কিনা তা পরীক্ষা করুন (পিংয়ের ফেরতের মান শূন্য)। হোস্ট যদি বেঁচে না থাকে তবে আবার পিং করুন।

নিম্নলিখিত কোডটি একটি ফাইল হিসাবে সংরক্ষণ করা যেতে পারে এবং আর্গুমেন্ট হিসাবে হোস্টনামের সাথে কল করা যায়, বা প্রথম এবং শেষ লাইনটি কেটে ফেলা হয় এবং বিদ্যমান স্ক্রিপ্টের মধ্যে ফাংশন হিসাবে ব্যবহৃত হয় (ওয়েটফোস্ট হোস্ট হোস্টনেম)।

কোডটি ব্যর্থতার কারণটি মূল্যায়ন করে না যদি পিংয়ের কোনও প্রতিক্রিয়া দেখা দেয় না, এইভাবে হোস্টটির অস্তিত্ব না থাকলে চিরতরে লুপিং। আমার বিএসডি ম্যানপেজ প্রতিটি রিটার্ন মানটির অর্থ তালিকাভুক্ত করে, যখন লিনাক্স একটি না করে, তাই আমি অনুমান করি এটি পোর্টেবল নাও হতে পারে, এ কারণেই আমি এটিকে রেখে দিয়েছি।

#!/bin/bash

PING=`which ping`

function waitForHost
{
    if [ -n "$1" ]; 
    then
        waitForHost1 $1;
    else
        echo "waitForHost: Hostname argument expected"
    fi
}

function waitForHost1
{
    reachable=0;
    while [ $reachable -eq 0 ];
    do
    $PING -q -c 1 $1
    if [ "$?" -eq 0 ];
    then
        reachable=1
    fi
    done
    sleep 5
}
waitForHost $1

9
UNREACHEABLE=1;
while [ $UNREACHEABLE -ne "0" ]; 
   do ping -q -c 1 HOST &> /dev/null; UNREACHEABLE=$?; sleep 1;
done

আপনি ঘুম 1 টি সরিয়ে ফেলতে পারেন, হোস্টটি যখন পৌঁছনীয় হবে তবে পিং কোড 0 দিয়ে প্রস্থান করবে না এমন ক্ষেত্রে বন্যার যে কোনও সমস্যা প্রতিরোধ করার জন্য এটি এখানে এসেছে।


4

স্ট্যাকওভারফ্লোতে ভাল বিকল্পগুলি দেখুন । এখানে ব্যাশের একটি নমুনা রয়েছে, এটি সফল পিংয়ের ফলাফল না পাওয়া পর্যন্ত আপনাকে নিম্নলিখিত কোডটি থেকে লুপ করতে হবে।


ping -c 1 -t 1 192.168.1.1;
if [ $? -eq 0 ]; then
    echo "192.168.1.1 is up";
else 
    echo "ip is down";
fi


3

উপরের যে কোনও লুপগুলি পিংয়ের পরিবর্তে ফাইপিংয়ের সাথে ব্যবহার করা যেতে পারে যা আইএমও, পিংয়ের চেয়ে স্ক্রিপ্টগুলিতে ব্যবহারের জন্য আরও উপযুক্ত। দেখুন fping (1) বিস্তারিত জানার জন্য।

while ! fping -q $HOSTNAMES ; do :; done

মেশিনগুলি তাদের উপর কিছু করার আগে প্রস্তুত থাকলে তা পরীক্ষার জন্যও দরকারী। একটি সাধারণ উদাহরণ:

HOST1 HOST2 HOST3 এ h এর জন্য; করা
  যদি fping -q $ h; তারপর
     প্রতিধ্বনি -n "$ এইচ:"
     sshh h "uname -a"
  ফাই
সম্পন্ন

1

এটি একটি প্রদত্ত সংখ্যা বার চেষ্টা করবে।

t=4; c=0; r=0; until ping -c 1 hostname.com >/dev/null 2>&1 || ((++c >= t)); do r=$?; done; echo $r

প্রতিধ্বনির পরিবর্তে $r, আপনি এটি পরীক্ষা করে এর মান অনুযায়ী কাজ করতে পারেন:

if ((r)); then echo 'Failed to contact host'; else echo 'Continuing with script'; fi

1

বিএসডি পিং-এ সাইন্টটি সুন্দরভাবে পরিচালনা করতে।

HOST=google.com NO=1; while [ $NO -ne 0 ]; do ping -W1 -c1 $HOST &>/dev/null; NO=$?;echo "$(date) ($HOST) $NO" ; done; echo "$(date) ($HOST) reachable"

একটি ফাংশন হিসাবে

ping_until(){
  local NO=1
  while [ $NO -ne 0 ]; do
    ping -W1 -c1 $1 &>/dev/null; NO=$?
    # Optionally block ICMP flooding
    # sleep 1
    echo "$(date) ($1) ($NO)"
  done
}

0

আমি নিম্নলিখিত ফাংশন ব্যবহার করছি। আমি এটি পছন্দ করি কারণ আমি এটি বলতে পারি যে কিছুক্ষণ পরে চেষ্টা করা বন্ধ করুন:

#!/usr/bin/env bash

function networkup {
  # Initialize number of attempts
  reachable=$1
  while [ $reachable -ne 0 ]; do
    # Ping supplied host
    ping -q -c 1 -W 1 "$2" > /dev/null 2>&1
    # Check return code
    if [ $? -eq 0 ]; then
      # Success, we can exit with the right return code
      echo 0
      return
    fi
    # Network down, decrement counter and try again
    let reachable-=1
    # Sleep for one second
    sleep 1
  done
  # Network down, number of attempts exhausted, quiting
  echo 1
}

কিছু চালু করার জন্য এটি এর মতো ব্যবহার করা যেতে পারে:

# Start-up a web browser, if network is up
if [ $(networkup 60 www.google.com) -eq 0 ]; then
  firefox &
fi

0

সাধারণভাবে আমি আমার ডাটাবেস বা অন্যান্য সার্ভারটি আসার অপেক্ষা করতে চাই, তবে আমি খুব বেশি সময় অপেক্ষা করতে চাই না । নিম্নলিখিত কোডটি 10 ​​সেকেন্ডের জন্য অপেক্ষা করে, যদি সার্ভার সময়সীমার মধ্যে উপস্থিত না হয় তবে প্রস্থান কোড সেট করে।

যদি সার্ভারটি সময়সীমাটির আগে উপস্থিত হয়, লুপটি সংক্ষিপ্ত-প্রচারিত হবে যাতে পরবর্তী বিট কোড চলতে পারে।

for i in `seq 1 10`; do date ; sleep 1 ; ping -c1 ${HOST} &>/dev/null && break ; done

0

গর্ডন ডেভিসনের উত্তরের আরও বর্ধন:

until $(ping -c1 www.google.com &>/dev/null); do :; done

আশেপাশের '$ ()' এর সাথে একটি সাব-শেল শুরু হয়ে গেছে এবং অতএব হোস্টটি উপলভ্য না হয়ে যায় এমন পরিস্থিতিতে লুপটি বন্ধ করতে আপনি নিয়ন্ত্রণ-সি ব্যবহার করতে পারেন।

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