Pergunta

Eu estou escrevendo um script para o uso do disco de captura em um sistema (sim, eu sei que há software que pode fazer isso). Para fins de relatório de banco de dados, eu quero que o intervalo entre os pontos de dados a ser tão iguais quanto possível. Por exemplo, se eu sou o uso do disco de votação a cada 10 minutos, eu quero que cada ponto de dados a ser AAAA-MM-DD HH: [0-5] 00:00. Se eu sou am polling a cada 5 minutos, seria AAAA-MM-DD HH: [0-5] [05]:. 00

Se eu tiver um script ksh (ou mesmo um script Perl) para capturar o uso do disco, como posso deixar o script vêm ativo e espera para o próximo "tempo Poll" antes de tirar um instantâneo, e depois dormir para a correcta número de segundos até a próxima "tempo Poll". Se eu sou polling a cada 5 minutos, e é 11:42:00, então eu quero dormir durante 180 segundos para que ele irá tirar um instantâneo em 11:45:00 - e depois dormir por 5 minutos por isso vai levar outro instantâneo em 11:50:00.

Eu escrevi uma maneira que funciona se o meu tempo de votação é a cada 10 minutos, mas se eu alterar o tempo de pesquisa para um número diferente, ele não funciona. Eu gostaria que ele seja flexível sobre o tempo de pesquisa.

Eu prefiro fazer isso no shell script, mas se ele é demais código, Perl seria bom também.

Algumas ideias sobre como fazer isso?

Agradecemos antecipadamente!

Brian

Editar : Wow - Eu deixei de fora uma parte muito importante - que cron está desativado, por isso não vou ser capaz de usar cron para esta tarefa. Lamento muito a todas as pessoas que deram isso como uma resposta, porque sim, que é a maneira perfeita para fazer o que eu queria, se eu poderia usar cron.

Eu vou estar usando o nosso programador para lançar meu script logo antes da meia-noite todos os dias, e eu quero o script para lidar com execução ao exatas "tempos de votação", dormindo no meio, e sair à meia-noite.

Mais uma vez, eu sinto muito por não esclarecer em crontabs.

Foi útil?

Solução

Se eu fosse fazer isso, eu usaria o programador do sistema (cron ou outra coisa) para agendar o meu programa para ser executado a cada 180 segundos.

EDIT: eu poderia ter entendido mal o seu pedido. Você está olhando mais para algo ao longo das seguintes linhas? (Eu suspeito que há um bug ou dois aqui):

outra edição : remover a dependência do Time :: Local (mas agora eu suspeito que mais bugs; -)

#!/usr/bin/perl

use strict;
use warnings;

use POSIX qw( strftime );

my $mins = 5;

while ( 1 ) {
    my ($this_sec, $this_min) = (localtime)[0 .. 1];

    my $next_min = $mins * ( 1 + int( $this_min / $mins ) );
    my $to_sleep = 60 * int( $next_min - $this_min - 1 )
                 + 60 - $this_sec;

    warn strftime('%Y:%m:%d %H:%M:%S - ', localtime),
        "Sleeping '$to_sleep' seconds\n";

    sleep $to_sleep;
}

__END__

Outras dicas

cron irá fazer o trabalho.

http://en.wikipedia.org/wiki/Cron

Apenas configurá-lo para executar o script ksh nos momentos que você precisa e está feito

Você pode querer considerar o uso cron . Este é exatamente o que foi feito.

Tê-lo dormir por um tempo muito curto, <= 1 seg, e verificar cada vez que se o tempo poll chegou. uso do processador incremental será insignificante.

Edit: cron é bom se você sabe o intervalo que você vai usar e não pretendo mudar com freqüência. Mas se você mudar intervalos muitas vezes, considere um script de execução contínua w / tempo de sono curto.

Dependendo de como grão fino suas necessidades resolução de tempo a ser, pode haver uma necessidade de escrever o seu estilo daemon script. Iniciá-lo uma vez, enquanto (1) e fazer a lógica dentro do programa (você pode verificar cada segundo até que é hora de correr de novo).

Time :: HiRes do Perl permite muito fina granularidade se você precisar dele.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top