Получить сценарий Unix для запуска в одно и то же время каждый раз - PullRequest
0 голосов
/ 08 июня 2009

Я пишу сценарий для захвата использования диска в системе (да, я знаю, что есть программное обеспечение, которое может сделать это). В целях отчетности базы данных я хочу, чтобы интервал между точками данных был как можно более равным. Например, если я опрашиваю использование диска каждые 10 минут, я хочу, чтобы каждая точка данных была ГГГГ-ММ-ДД ЧЧ: [0-5] 0:00. Если я опрашиваю каждые 5 минут, это будет ГГГГ-ММ-ДД ЧЧ: [0-5] [05]: 00.

Если у меня есть сценарий ksh (или даже сценарий Perl) для захвата использования диска, как я могу разрешить сценарию активизироваться и дождаться следующего «времени опроса», прежде чем делать снимок, а затем спать для правильного количество секунд до следующего «времени опроса». Если я опрашиваю каждые 5 минут, а сейчас 11:42:00, то я хочу спать 180 секунд, чтобы сделать снимок в 11:45:00, а затем спать 5 минут, чтобы сделать еще один снимок в 11: 50: 00.

Я написал способ, который работает, если мое время опроса составляет каждые 10 минут, но если я изменю время опроса на другое число, оно не будет работать. Я бы хотел, чтобы он был гибким во время опроса.

Я предпочитаю делать это в сценарии оболочки, но если кода слишком много, Perl тоже подойдет.

Есть идеи, как этого добиться?

Заранее спасибо!

Brian

РЕДАКТИРОВАТЬ : Wow - я пропустил довольно важную часть - этот cron отключен, поэтому я не смогу использовать cron для этой задачи. Мне очень жаль всех людей, которые дали это в качестве ответа, потому что да, это идеальный способ сделать то, что я хотел, если бы я мог использовать cron.

Я буду использовать наш планировщик, чтобы запускать свой сценарий каждый день до полуночи, и я хочу, чтобы этот сценарий выполнялся в точное время опроса, между сном и выходом в полночь.

Опять же, я очень сожалею, что не разъяснил crontabs.

Ответы [ 5 ]

6 голосов
/ 08 июня 2009

cron сделает всю работу.

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

Просто настройте его так, чтобы он запускал ваш скрипт ksh в нужное время, и все готово

3 голосов
/ 08 июня 2009

Возможно, вы захотите использовать cron. Это именно то, для чего оно было сделано.

2 голосов
/ 08 июня 2009

Если бы я делал это, я использовал бы системный планировщик (cron или что-то еще), чтобы планировать выполнение моей программы каждые 180 секунд.

РЕДАКТИРОВАТЬ: Возможно, я неправильно понял ваш запрос. Вы ищете что-то по следующим направлениям? (Я подозреваю, что здесь есть одна или две ошибки):

ДРУГОЕ РЕДАКТИРОВАНИЕ : Удалить зависимость от Time :: Local (но теперь я подозреваю больше ошибок; -)

#!/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__
1 голос
/ 08 июня 2009

Дайте ему поспать очень короткое время, <= 1 сек, и проверяйте каждый раз, наступило ли время опроса. Инкрементное использование процессора будет незначительным. </p>

Edit: cron подойдет, если вы знаете, какой интервал вы будете использовать, и не собираетесь часто менять. Но если вы часто меняете интервалы, рассмотрите непрерывно работающий скрипт с коротким временем ожидания.

0 голосов
/ 08 июня 2009

В зависимости от того, насколько тонким должно быть ваше временное разрешение, может возникнуть необходимость в написании стиля вашего скрипта-демона. Запустите его один раз, а (1) и выполните логику внутри программы (вы можете проверять каждую секунду, пока не настанет время снова запускаться).

Perl's Time :: HiRes позволяет очень тонкую гранулярность, если вам это нужно.

...