나는 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까지의 각 초 값을 포함하는 각 분당 파일이 필요합니다(예: 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까지의 통계가 아니라 시작 이후(또는 시작 이후의 전체 통계)이기 때문입니다. 통계가 마지막으로 재설정되었습니다). 두 번째 줄(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
}'
이번에는 첫 번째 파일의 헤더가 아닌 첫 번째 행을 제외하고 각 항목은 지난 1초 동안의 통계가 됩니다.
답변2
1초 미만의 정확도가 필요하지 않은 경우 간단한 해결책은 다음과 같습니다.
while true ; do
sleep $[ 60 - $(date +%s) % 60 ];
do_something;
done