ファイルにbashスクリプトを書き込もうとすると、実行可能になるまでホストへのpingの実行を開始すると、ホストが到達可能になるとコマンドが実行されて実行が停止し、書き込みを試みましたが、スクリプトはカウントまでpingを続けます終わり、
さらに、そのプロセスをバックグラウンドで実行する必要がありますが、スクリプトをドル($
)フォアグラウンドで実行されていることを示す署名、
#!/bin/bash
ping -c30 -i3 192.168.137.163
if [ $? -eq 0 ]
then /root/scripts/test1.sh
exit 0
else echo “fail”
fi
私はこれを使用します、簡単なワンライナー:
while ! ping -c1 HOSTNAME &>/dev/null; do echo "Ping Fail - `date`"; done ; echo "Host Found - `date`" ; /root/scripts/test1.sh
HOSTNAME
を、pingしようとしているホストに置き換えます。
私はそれをバックグラウンドに置くことについての部分を逃しました、そのようにシェルスクリプトにその行を入れてください:
#!/bin/sh
while ! ping -c1 $1 &>/dev/null
do echo "Ping Fail - `date`"
done
echo "Host Found - `date`"
/root/scripts/test1.sh
そして、バックグラウンドで実行するには、次のようにします。
Nohup ./networktest.sh HOSTNAME > /tmp/networktest.out 2>&1 &
再度HOSTNAME
をpingしようとしているホストに置き換えます。このアプローチでは、シェルスクリプトに引数としてホスト名を渡します。
一般的な警告と同様に、ホストがダウンしたままの場合は、強制終了するかホストが見つかるまで、このスクリプトがバックグラウンドで継続的にpingを実行します。これを実行するときは、そのことを覚えておきます。これを忘れると、システムリソースを消費してしまう可能性があるからです。
パラメータ「-c 30」をpingに渡すと、pingを30回試行して停止します。コマンドが成功したかどうかを確認します。 1つのpingを含むループを実行して、このpingが成功するかどうかを確認するのが最善だと思います。そんな感じ:
while true;
do
ping -c1 google.com
if [ $? -eq 0 ]
then
/root/scripts/test1.sh
exit 0
fi
done
まだフォアグラウンドで実行されているということは、ターミナルでまだ印刷しているということであれば、stdinとstdoutを/ dev/nullにリダイレクトできます。
古い投稿ですが、提案として、pingで-w
オプションを使用してループを回避できます。例えば、
ping -w 30 -c 1 Host
毎秒1つのpingで30秒間試行し(デフォルトのpingはpingの間隔が1秒です)、最初に成功したpingで終了します。
タイムアウトが必要ない場合、つまりずっと待って、-w
で非常に大きな値を使用してください。
ping -oc 100000 Hostname > /dev/null && /root/scripts/test1.sh
ping -o
は、最初のパケットを受信した後にping
を終了します> /dev/null
は出力をリダイレクトするため、表示されません&&
は、前のコマンドが成功した場合、次のコマンドを実行しますさらに、プロセスの最後に&
を追加することで、プロセスをバックグラウンドで実行できます。たとえば、echo "123" &
はバックグラウンドで実行されます
#!/bin/sh
if [ $1 ]
then
for i in ` cat $1`
do
VAR1=$(ping -ac 2 $i| grep -c error)
if [ $VAR1 == "0" ]
then
echo " valid : $i"
else
echo " invalid : $i"
fi
done
else
echo " please present the file name. example: pong /tmp/a "
fi
これはスクリプトの修正です。
#!/bin/bash
ping -c1 10.1.1.23 > /dev/null
if [ $? -eq 0 ]
then
echo ok
exit 0
else
echo “fail”
fi
画面に表示されないように、出力を/dev/null
に送信する必要があります。
-c
はカウント用です。 -c30
を指定すると、スクリプトが次の行に進む前にpingを30回実行します。 -c1
を使用して、スクリプトの実行を高速化しています。
-i
は、各パケットを送信する間隔を数秒待ちます。したがって、-i3
は3秒待つことです。 -i
を削除して、スクリプトの実行を高速化します。
最後に重要なことですが、コードを見やすく読みやすくするためにインデントを使用します。
サンプル出力
user@linux:~$ ./script.sh
ok
user@linux:~$
user@linux:~$ ./script.sh
“fail”
user@linux:~$