ファイル内のIPアドレスのリストをpingし、ステータスを「up」または「down」として記録する必要があります。

ファイル内のIPアドレスのリストをpingし、ステータスを「up」または「down」として記録する必要があります。

ホストアドレスのリスト(非連続)をpingし、出力を「up」または「down」として記録する必要があります。始めましたが、スクリプトに問題があるようです。例えば。 150個のホストを含​​むホストファイルに対して次のスクリプトを実行すると、出力ファイルから400個以上の「up」または「down」応答が表示されます。

#!/usr/bin/bash
#script name: lrkdc01ping.sh
date >> /home/insight/scripts/lrkdc01ping.out
cat /home/insight/scripts/lrkdc01.txt |  while read output
do
    ping -c 1 "$output" >> /dev/null
    if [ $? -eq 0 ]; then
        echo "node is up" >> /home/insight/scripts/lrkdc01ping.out
    else
        echo "node is down" >> /home/insight/scripts/lrkdc01ping.out
    fi
done

答え1

毎回出力ファイルを追加する代わりに、実行されるたびに出力ファイルを消去する次のようなことを提案します。

#!/usr/local/bin/bash
outfile="/home/insight/scripts/lrkdc01ping.out"
date > "$outfile"
while read output; do
    echo -n "$output is " >> "$outfile"
    if ping -c1 "$output" > /dev/null 2>&1; then
        echo "up" >> "$outfile"
    else
        echo "down" >> "$outfile"
    fi
done < /home/insight/scripts/lrkdc01.txt

主な違いは、callの>代わりに使用することです。したがって、実行するたびにファイルがきれいになり、終了コードの使用が簡単になります。>>dateping

クリーナー

if verb; then
    action
else
    failure_action
fi

代わりに

verb
if [[ 0 -eq $? ]]; then
    action
else
    failure_action
fi

また、出力ファイルの名前を移動または変更することにした場合は、4つの場所を編集する必要なく、変数に入れて1つの場所でのみ更新できます。私の一般的な経験則は、「同じ内容を複数回入力すると抽象化する必要がある」です。

関連情報