Я хочу запускать скрипт раз в день (и только в выходные), однако я не могу использовать 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 часов вечера.
Снова в В тот день, когда не было 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 предоставит строку, зависящую от языкового стандарта, поэтому может не работать, если вы измените языковой стандарт.
Предполагая, что вы действительно не можете использовать 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
Для решения 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();
Проблема с использованием длительного сна
заключается в том, что представление вашей программы о том, сколько сейчас времени, будет дрейфовать. Было бы лучше просто зацикливаться с короткими периодами сна
и проверять, находитесь ли вы в желаемом окне.
Если ваши администраторы не разрешают вам использовать 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
Вы можете использовать snaked . Он похож на cron, но написан на Perl.