Как смоделировать задание cron

Я хочу запускать скрипт раз в день (и только в выходные), однако я не могу использовать cron работа для этого.

Я думал о том, чтобы иметь бесконечный цикл while, поспать 24 часа, проверить, выходной ли он, и если да, выполнить сценарий.

Какое хорошее решение для bash на linux?

моя текущая реализация:

#! /bin/bash

 while [ true ]; do
    if [[ $(date +%u) -lt 6 ]]; then
               ./program
        else
             echo Today is a weekend, processing is skipped. Back to sleep.
    fi
    sleep  86400
done

И я запустите этот скрипт в 5 часов вечера.

12
задан vehomzzz 20 August 2010 в 19:07
поделиться

5 ответов

Снова в В тот день, когда не было crontab для каждого пользователя, я часто делал это с помощью at (1).

#!/bin/sh
... do stuff...
at -f /path/to/me 5pm tomorrow

Таким образом, ваш скрипт запускается и планирует следующий вызов.

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

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

day=Saturday
if [ $(date +%u) -eq 6 ] ; then day=Sunday ; fi
at -f /path/to/me 5pm next $day

Если этот сценарий запускается в субботу, он планирует следующий запуск на следующее воскресенье, в противном случае он запускается в следующую субботу. [$ (date +% A) = Saturday] может быть более читаемым, но% A предоставит строку, зависящую от языкового стандарта, поэтому может не работать, если вы измените языковой стандарт.

11
ответ дан 2 December 2019 в 19:29
поделиться

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

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

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

Необходимо учитывать переход на летнее / летнее время. Один день в году будет иметь 23 часа, а другой - 25.

Вы можете использовать что-то вроде этого псевдокода:

set next_time_to_run
loop forever
    sleep time_difference_in_seconds(current_time, next_time_to_run)
    if current_time is close to next_time_to_run
        execute code
        update next_time_to_run
    end if
end loop
1
ответ дан 2 December 2019 в 19:29
поделиться

Для решения Perl посмотрите Schedule :: Cron Модуль CPAN:

use 5.012;
use warnings;
use Schedule::Cron;

my $cron = Schedule::Cron->new( sub {} );

# add weekend run @ 05:00 
$cron->add_entry('0 5 * * Sat,Sun', sub {
    system './program';
});

$cron->run();
5
ответ дан 2 December 2019 в 19:29
поделиться

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

Если ваши администраторы не разрешают вам использовать cron , они могут быть недовольны тем, что вы обходите это ограничение.

Тем не менее, вот приблизительный набросок:

while :
do
    dow=$(date +%u)
    if (( dow == 6 || dow == 7 ))
    # you can check a flag or counter to limit the number of times it's performed
    # or use a more refined date spec than just whole days (times of day, in other words)
    then
        do_something
        sleep 1h    # or use a smaller or larger interval
    fi
done
1
ответ дан 2 December 2019 в 19:29
поделиться

Вы можете использовать snaked . Он похож на cron, но написан на Perl.

0
ответ дан 2 December 2019 в 19:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: