Bashスクリプトから日付のBash出力

Bashスクリプトから日付のBash出力

私は次のスクリプトを書いた。

#!/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。このパラメーターを使用すると、出力タイムスタンプを生成するときに現在の時刻が使用されます。また、すべての呼び出しに対してリダイレクトせず、外部ループに対して一度だけリダイレクトします。printfbash-1printfprintf

$?このコードはpingwith directを使用して明示的なテストを削除しますifpingwith(詳細出力の場合)は-vとにかく出力を削除するため呼び出されません。

関連情報