매분의 첫 번째 초에 반복 시작

매분의 첫 번째 초에 반복 시작

나는 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분 남짓이라고 가정하고 비동기 &실행을 추가했습니다 . 그런 다음 동기식으로(즉, 없이) 실행하면 드리프트가 시작됩니다. 여기서 우리는 매 순간이 시작되는지 확인합니다 .nicstatnicstat 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

관련 정보