Obter um script Unix para ser executado em exatamente o mesmo tempo cada vez
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.
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.