特定のアドレスにpingを送信し、見つかったらpingを停止する方法を教えてください。
私はそれをbashスクリプトで使用したいので、ホストが起動しているときにスクリプトはpingを続け、ホストが利用可能になった瞬間からスクリプトが続行します...
特定のアドレスにpingを送信し、見つかったらpingを停止する方法を教えてください。
私はそれをbashスクリプトで使用したいので、ホストが起動しているときにスクリプトはpingを続け、ホストが利用可能になった瞬間からスクリプトが続行します...
回答:
マルティナスの答えをさらに簡素化:
until ping -c1 www.google.com >/dev/null 2>&1; do :; doneping自体がループテストとして使用されることに注意してください。成功するとすぐにループが終了します。ループの本文は空で:、構文エラーを防ぐためにnullコマンド " "が使用されています。
更新:Control-Cがpingループをきれいに終了する方法を考えました。これにより、ループがバックグラウンドで実行され、割り込み(Control-C)シグナルがトラップされ、発生した場合にバックグラウンドループが強制終了されます。
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"
少し遠回りですが、ループをキャンセルできるようにしたい場合は、トリックを行う必要があります。
pingは、pingをあきらめる前に10秒待機します。これを1秒に減らしたい場合は、を使用できます-w1。
                    -W1
                    kill %1を強制終了します。
                    ループを実行し、1つのpingを送信し、ステータスに応じてループを中断できます。たとえば、(bash):
while true; do ping -c1 www.google.com > /dev/null && break; doneこれをスクリプトのどこかに置くと、www.google.comping可能になるまでブロックされます。
while trueとbreakIMO、クリーンなソリューションです。
                    while true; do sleep 5; ping ...
                    私は質問が古いことを知っています...そして、特にに関して尋ねますがping、私は私の解決策を共有したかったです。
ホストを再起動するときにこれを使用して、再びSSHでホストに戻ることができるかどうかを確認します。(開始さpingれる前に数秒間応答しsshdます。)
until nc -vzw 2 $host 22; do sleep 2; doneターゲットホストに1回pingを実行します。pingが成功したかどうかを確認します(pingの戻り値はゼロです)。ホストが稼働していない場合は、再度pingを実行します。
次のコードは、ファイルとして保存してホスト名を引数として呼び出したり、最初と最後の行を取り除いて既存のスクリプト内の関数として使用したりできます(waitForHostホスト名)。
pingが応答しない場合、コードは失敗の原因を評価しないため、ホストが存在しない場合は永久にループします。私のBSDマンページには各戻り値の意味がリストされていますが、Linuxのものはそうではないので、これは移植性がないかもしれないと思います。
#!/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
stackoverflowで適切なオプションを参照してください。bashのサンプルを次に示します。成功したping結果が返されるまで、次のコードをループする必要があります。
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
これは、指定された回数試行します。
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'; fiBSD pingでSIGINTを適切に処理するため。
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
}
私は次の機能を使用しています。しばらくしてから試すのをやめるように指示できるので気に入っています。
#!/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