com 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 &
}
Eu adicionei um &
para executar nicstat
de forma assíncrona, supondo que nicstat 1 60
levaria um pouco mais de um minuto para ser executado. Então, se nós o executássemos de maneira síncrona (isto é, sem o &
), ele começaria a derivar. Aqui, garantimos que nicstat
seja iniciado exatamente a cada minuto.
No entanto, nicstat 1 60
leva pouco mais de 59 segundos para ser executado, não 60, pois a primeira linha exibida não é a estatística das 12:00:00 às 12:00:01, mas as estatísticas gerais desde a inicialização (ou desde as estatísticas foram redefinidas pela última vez). E a segunda linha (rotulada 12:00:01) é para as estatísticas de 12:00:00 a 12:00:01 (e a 60ª linha após 59 segundos rotulada 12:00:59 é para as estatísticas das 12:00 : 58 às 12:00:59.
As estatísticas de 12:00:59 a 12:01:00 serão perdidas. Então você pode querer alterá-lo para nicstat 1 61
, para que a saída contenha 61 linhas, a primeira para as estatísticas desde a inicialização e as próximas 60 para as estatísticas de cada segundo naquele minuto.
Como outra abordagem para seu problema, você pode executar apenas um nicstat
e ter awk
dividido sua saída em arquivos de log:
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
}'
Desta vez, exceto pela primeira linha sem cabeçalho do primeiro arquivo, cada entrada será a estatística do segundo passado.