在每分鐘的開始第二個循環執行
我正在使用 nicstat 這個命令
while true; do nicstat -eth1 1 60 > log-$(date +%F-%T).txt; done
此命令為我的乙太網介面的每 60 秒創建一個日誌文件,問題是文件不是每個時鐘分鐘,執行此命令時創建的第一個日誌文件可能類似於 log-12:00:04.txt “包含本分鐘第二個數字 4 的值,以下一分鐘的第二個數字 3 結尾”,如果它不是在一分鐘開始時精確地盯著,過了一會兒,我開始像 log-12:14 一樣增加秒數:05.txt,然後幾分鐘後 log-12:32:06 …等。
我需要每個時鐘分鐘的文件,其中包含從 00 到 59 的每個 scecound 的值,例如:log-12:00:00.txt、log-12:01:00.txt、log-12:02:00.txt 等.
與
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 & }
我確實添加了一個非同步
&
執行nicstat
,假設執行nicstat 1 60
需要一分鐘多一點。然後,如果我們同步執行它(即沒有&
),它就會開始漂移。在這裡,我們確保nicstat
每分鐘都準確啟動。但是
nicstat 1 60
執行時間略多於 59 秒,而不是 60 秒,因為它顯示的第一行不是 12:00:00 到 12:00:01 的統計數據,而是自啟動以來的總體統計數據(或自上次重置統計數據以來) . 第二行(標記為 12:00:01)是 12:00:00 到 12:00:01 的統計數據(59 秒後的第 60 行標記為 12:00:59 是從 12:00 開始的統計數據:58 至 12:00:59)。12:00:59 到 12:01:00 的統計資訊將失去。因此,您可能希望將其更改為
nicstat 1 61
,以便輸出包含 61 行,第一行用於自啟動以來的統計資訊,接下來的 60 行用於該分鐘每秒的統計資訊。作為解決問題的另一種方法,您可以只執行一個
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 }'
這一次,除了第一個文件的第一個非標題行之外,每個條目都將是過去第二個的統計資訊。