Как я могу запустить мой программный код после фиксированных интервалов? - PullRequest
1 голос
/ 12 сентября 2010

У меня есть этот Perl-скрипт для мониторинга папки в Linux.

Чтобы постоянно проверять наличие обновлений в каталоге, у меня есть цикл while, который спит в течение 5 минут междупоследовательные циклы:

while(1) {

    ...
    sleep 300;
}

Никто на мой другой вопрос предложил использовать cron для планирования вместо цикла for.

Эта конструкция while, без каких-либоbreak кажется мне безобразным по сравнению с отправкой cronjob с использованием crontab :

0 */5 * * * ./myscript > /dev/null 2>&1
  • Является ли cron правильным выбором?Есть ли какие-либо преимущества использования конструкции цикла while?
  • Есть ли более эффективные способы сделать это, кроме цикла и cron?

Кроме того, я использую 2.6.9сборка ядра.

Ответы [ 5 ]

5 голосов
/ 12 сентября 2010

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

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

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

Мой совет - просто использовать cron. Вот для чего он предназначен. Кроме того, я редко перенаправляю вывод на /dev/null, что делает его слишком сложным для отладки. Обычно я просто перенаправляю в файл в файловой системе /tmp, чтобы видеть, что происходит.

Вы можете добавить, если у вас есть автоматизированная процедура очистки, и вы даже можете написать в более приватное место, если вы беспокоитесь о том, что кто-то увидит что-то в выводе.

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

4 голосов
/ 12 сентября 2010
  1. Почему вы не заставляете процесс сборки, который помещает сборку в каталог, делать уведомления?(См. SO 3691739 , откуда это происходит!)

  2. Запуск программы cron вполне приемлем - и проще, чем постоянный цикл со сном,хотя и ненамного.

  3. Против решения cron, поскольку процесс является простым однократным, вы не можете сказать, что изменилось с момента последнего запуска - естьнет государства.(Или, точнее, если вы предоставляете состояние - возможно, через файл - вы делаете жизнь намного более сложной, чем запуск одного сценария, который сохраняет свое состояние внутри.)

  4. Кроме того,остановка службы уведомлений менее очевидна.Если вокруг висит какой-то один процесс, вы убиваете его, и уведомления прекращаются.Если уведомления запускаются cron, то вы должны знать, что они исчерпали crontab, знать, чей это crontab, и отредактировать эту запись, чтобы остановить ее.

  5. Вам также следует подумать о том, чтобы убедить вашу компанию перейти на версию Linux, в которой доступен механизм inotify.

1 голос
/ 12 сентября 2010

Если вы используете цикл вместо cron и хотите, чтобы ваша работа выполнялась через регулярные промежутки времени, sleep (300) имеет тенденцию дрейфовать. (учтите время выполнения остальной части вашего скрипта)

Я предлагаю использовать такую ​​конструкцию:

use constant DELAY => 300;

my $next=time();
while (1){
    $next+=DELAY;

    ...;

    sleep ($next-time());
};
0 голосов
/ 13 сентября 2010

, если вы не хотите использовать cron. это http://upstart.ubuntu.com/ можно использовать для процессов няни. или вы можете использовать часы в зависимости от того, что проще.

0 голосов
/ 13 сентября 2010

Еще одна альтернатива - утилита «анакрон».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...