faz um loop ser executado no segundo inicial de cada minuto

0

Estou usando para nicstat este comando

while true; do nicstat -eth1 1 60 > log-$(date +%F-%T).txt; done

este comando cria um arquivo de log para cada 60 segundos da minha interface ethernet, o problema é que os arquivos não são para cada minuto de clock, ao executar este comando o primeiro arquivo de log criado pode ser algo como log-12: 00: 04 .txt "contendo valores do segundo número 4 neste minuto terminando com o segundo número 3 no minuto seguinte" também se não foi tão precisamente olhando para o início do minuto, depois de um tempo eu comecei a ter segundos de passo como log-12: 14: 05.txt, depois de alguns minutos log-12: 32: 06 ... etc.

Eu preciso de um arquivo para cada minuto de clock contendo valores para cada scecound de 00 até 59, como: log-12: 00: 00.txt, log-12: 01: 00.txt, log-12: 02: 00. txt, etc.

    
por Hossam Zalabany 15.03.2017 / 21:18

2 respostas

1

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.

    
por 16.03.2017 / 12:36
0

Se você não precisa de precisão abaixo de segundos, a solução simples seria algo como:

while true ; do 
    sleep $[ 60 - $(date +%s) % 60  ];
    do_something;
done
    
por 16.03.2017 / 12:42