私は次のスクリプトを書いた。
#!/bin/bash
target="1.1.1.1"
while true;
do
ping $target -c 1 -v > /dev/null
if [[ $? -ne 0 ]]; then
echo "$(date +"%d/%m/%y %R:%S")" >> netStabilityLog
fi
sleep 5s
done
1つの問題を除いて、ほぼ完全に動作します。出力ファイルから以下をnetStabilityLog
取得します。
28/06/22 17:19:26
28/06/22 17:20:06
28/06/22 17:45
28/06/22 18:36:00
28/06/22 18:51
秒が表示されない場合があります。なぜそんなことですか?
答え1
同時に実行されるいくつかのわずかに異なるスクリプトコピーがあり、それぞれが同じ出力ファイルに書き込まれます。実行中のスクリプトのバージョンの1つ以上は、出力に秒を追加しません。
スクリプト自体については、外部ユーティリティを削除し、date
条件付き出力とリダイレクトを異なる方法で行うという私の意見をお伝えします。また、欠落している参照を並べ替えます。
#!/bin/bash
ipaddr=1.1.1.1
while true; do
if ! ping -c 1 "$ipaddr" >/dev/null 2>&1
then
printf '%(%d/%m/%y %T)T\n' -1
fi
sleep 5
done >>netStabilityLog
これはバージョン4.2で導入されたフォーマット文字列を使用します%(...)T
。このパラメーターを使用すると、出力タイムスタンプを生成するときに現在の時刻が使用されます。また、すべての呼び出しに対してリダイレクトせず、外部ループに対して一度だけリダイレクトします。printf
bash
-1
printf
printf
$?
このコードはping
with directを使用して明示的なテストを削除しますif
。ping
with(詳細出力の場合)は-v
とにかく出力を削除するため呼び出されません。