私は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分余りだと仮定し、非同期&
実行を追加しました。その後、同期的に(つまりなしで)実行すると、ドリフトが開始されます。ここでは、各瞬間が始まるかどうかを確認します。nicstat
nicstat 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秒間の統計になります。
答え2
1秒未満の精度が必要ない場合は、簡単な解決策は次のとおりです。
while true ; do
sleep $[ 60 - $(date +%s) % 60 ];
do_something;
done