Запускать Cronjob каждую ночь между 3-6 часами, но только один раз

Я хочу запускать cronjob ежедневно в определенный промежуток времени, но только один раз за этот период. Как это возможно?

Я вижу возможность в анакроне, но не знаю, как создать такой сценарий.

0
задан 19 August 2013 в 21:21

3 ответа

Можно разместить Вас cronjob в /etc/cron.daily/ и это будет автоматически работать в тот период времени.


Править:

Извините, я ссылался на старую установку Debian где anacron не был установлен по умолчанию. В этом случае /etc/cron.daily/ выполнялся /etc/crontab на 6:25. Но более новые установки Debian (и также - Ubuntu) установка anacron по умолчанию и так /etc/cron.daily/ будет выполняться /etc/anacrontab спустя пять минут после этого anacron был запущен или каждый новый день.


Для достижения расписания (из комментариев), можно настроить cronjob, который будет, например, каждые 10 минут между 3-6 запускаются также anacron это будет заботиться, который задание резервного копирования только выполняет однажды, или можно записать пользовательский сценарий управления.

1. Альтернатива: anacron

mkdir ~/.local/share/anacron_spool
echo "1 0 backup.daily /path/to/backup.sh" > ~/.config/anacrontab
(crontab -l; echo "*/10 3-6 * * * /usr/sbin/anacron -s -t $HOME/.config/anacrontab -S $HOME/.local/share/anacron_spool") | crontab -

Это сделает anacron для сериализации (-s) выполните все задания, определенные в ~/.config/anacrontab. Поскольку значением по умолчанию только базируются, имеет разрешение записи записать в /var/spool/anacron/ где метки времени хранятся, мы используем пользовательский dir шпульки (-S). Если все работы будут делаться на сегодняшний день anacron, то выйдет.

2. Альтернатива: пользовательский сценарий управления

Откройте редактора (например. sudo nano /usr/local/bin/run_once_a_day.sh) и вставьте это:

#!/bin/bash
SPOOL="$HOME/.local/share/run_once_spool/"
if [ $# != 2 ]; then
    echo "Usage: $(basename $0) <job-identifier> <command>"
    exit 1
fi

if [ ! -d $SPOOL ]; then
    mkdir $SPOOL
fi

if [ -e ${SPOOL}${1} ]; then
    last_run=$(cat ${SPOOL}${1})
else
    last_run=0
fi

today=$(date +%Y%m%d)
if [ $last_run != $today ]; then
    $2
    echo $today > ${SPOOL}${1}
fi

Нажмите CTRL+O для сохранения и CTRL+X для выхода. Сделайте это executeable и добавьте cronjob, который будет периодически запускать его с:

sudo chmod 755 !$
(crontab -l; echo "*/10 3-6 * * * /usr/local/bin/run_once_a_day.sh backup.daily /path/to/backup.sh") | crontab -
2
ответ дан 19 August 2013 в 21:21

Я думаю, что самый простой обходной путь - это вызывать скрипт-обертку каждые N минут в течение интервала, но он начинается с проверки наличия файла «locker», который он создает при выполнении.

#!/bin/bash
[[ -f /dev/shm/cron-once-script-lock ]] && exit 0
touch /dev/shm/cron-once-script-lock

actualcronjob.sh # or whatever non-script command it may be

# end of wrapper script

И линия cron будет выглядеть следующим образом:

*/10 3-6 * * * /wherever/the/script/is/wrapper-script.sh

Или, возможно,

*/10 3-6 * * * bash /wherever/the/script/is/wrapper-script.sh

Единственное предостережение в том, что cron работает в ограниченной «среде», и вы можете нужно экспортировать переменные окружения и тому подобное, но это совсем другая тема.

0
ответ дан 19 August 2013 в 21:21

Задание cron будет запускаться каждый раз только один раз по заданному расписанию / времени. Таким образом, если вы установите задание cron, в которое время вы хотите от 3 до 6, оно будет выполняться только один раз в указанное время. Только один раз и никогда больше, чем один раз!

См. Больше объяснений и примеров на: http://en.wikipedia.org/wiki/Cron

0
ответ дан 19 August 2013 в 21:21

Другие вопросы по тегам:

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