毎分の最初の秒で繰り返し開始

毎分の最初の秒で繰り返し開始

私はnicstatこのコマンドを使用しています

while true; do nicstat -eth1 1 60 > log-$(date +%F-%T).txt; done

このコマンドは、イーサネットインターフェイス用に60秒ごとにログファイルを生成します。問題は、ファイルが毎時計分のものではないということです。このコマンドを実行したときに生成された最初のログファイルは、次のようなlog-12:00:04.txtのように見えます。この分の2番目の数字4の値は、次の分の2番目の数字3で終わります。 05.txtを追加し、数分後にlog-12:32:06を追加します...など。

00から59までの各秒値を含む毎分のファイルが必要です(例:log-12:00:00.txt、log-12:01:00.txt、log-12:02:00)。 txtなど

ベストアンサー1

そしてzsh

#! /bin/zsh -

zmodload zsh/datetime # for $EPOCHREALTIME/strftime...
zmodload zsh/zselect  # for sub-second sleeps
zmodload zsh/mathfunc # for int()

# wait till start of the next minute at first
for ((next = (EPOCHSECONDS / 60 + 1) * 60;; next += 60)) {
  (( sleep = int((next - $EPOCHREALTIME) * 100) ))
  (( sleep <= 0 )) || zselect -t $sleep
  strftime -s now %T $next
  nicstat -i eth1 1 60 > log-$now.txt &
}

ランタイムが1分余りだと仮定し、非同期&実行を追加しました。その後、同期的に(つまりなしで)実行すると、ドリフトが開始されます。ここでは、各瞬間が始まるかどうかを確認します。nicstatnicstat 1 60&nicstat

ただし、nicstat 1 60実行時間は60秒ではなく59秒を少し超えています。最初の行に表示されるのは、12:00:00 から 12:00:01 までの統計ではなく、開始以降(または開始後の全体統計)であるためです。統計は最後にリセットされました)。 2行目(12:00:01と表示)は12:00:00から12:00:01までの統計です(59秒後の60行目は12:00:59と表示され、12:00から始まります)統計です。

12:00:59から12:01:00までの統計情報が失われます。したがって、nicstat 1 61出力には61行が含まれ、最初の行は開始後の統計用であり、次の60行はその分の1秒あたりの統計用になるように変更できます。

問題を解決する別の方法で1つを実行し、nicstat出力awkをログファイルに分割することができます。

nicstat -i eth1 1 | awk '
  NR == 1 {header = $0; next}
  !/^[012]/ {next} # skip other headers
  {
    log = "log-" substr($0, 1, 6) "00.log"
    if (log != last_log) {
      if (last_log) close(last_log)
      print header > log
      last_log = log
    }
    print > log
  }'

今回は、最初のファイルのヘッダーではなく最初の行を除いて、各項目は過去1秒間の統計になります。

おすすめ記事