Я хочу запускать cronjob ежедневно в определенный промежуток времени, но только один раз за этот период. Как это возможно?
Я вижу возможность в анакроне, но не знаю, как создать такой сценарий.
Можно разместить Вас 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
это будет заботиться, который задание резервного копирования только выполняет однажды, или можно записать пользовательский сценарий управления.
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, то выйдет.
Откройте редактора (например. 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 -
Я думаю, что самый простой обходной путь - это вызывать скрипт-обертку каждые 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 работает в ограниченной «среде», и вы можете нужно экспортировать переменные окружения и тому подобное, но это совсем другая тема.
Задание cron будет запускаться каждый раз только один раз по заданному расписанию / времени. Таким образом, если вы установите задание cron, в которое время вы хотите от 3 до 6, оно будет выполняться только один раз в указанное время. Только один раз и никогда больше, чем один раз!
См. Больше объяснений и примеров на: http://en.wikipedia.org/wiki/Cron