Запуск задач по cron, все ли правильно или где-то ошибка?

Автор gardarea51, 01 февраля 2013, 07:48:26

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

gardarea51

Привет всем!  :)
Вчера дописал скрипты для резервного копирования и задал cron'у их выполнять следующими инструкциями:
root@smb:~# cat /etc/cron.d/backups
#Резервное копирование файлов системы с lvm-снапшотов в инкрементные tar-архивы
#1правило - запуск полного бэкапа в 00:01 1го числа каждого месяца
#2правило - запуск недельного бэкапа в 00:01 каждое воскресенье, кроме 1го числа месяца
#3правило - запуск ежедневного бэкапа в 00:01 каждый день, кроме 1го числа месяца и воскресенья

1 0 1    * * root /root/runbackups/tar_month
1 0 2-31 * 7 root /root/runbackups/tar_week
1 0 2-31 * 1-6 root /root/runbackups/tar_day

Сегодня с утра в 00:01 у нас 1е число месяца, пятница. Но придя утром обнаружил, что был выполнен скрипт tar_month и tar_day. Причем он еще и выполнился как то неправильно, в архивах не было никаких данных. У меня возникло ощущение, что при вызове cron'ом скриптов не обрабатываются команды cd в скриптах.

Подскажите - правильно ли указано время выполнения скриптов или у меня где-то ошибка? А потом уж буду думать почему при вызове их cron'ом они работают не так, как при прямом вызове указанных команд.

rayanAyar

#1
Попробуйте добавить перед задачами:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin


Сообщение объединено: 01 февраля 2013, 09:20:53

По поводу времени: день месяца "ИЛИ" (а не "И") день недели. Этот случай описан здесь:
man 5 crontab

Должно быть что-то типа того:

1 0 2-31 * * root test $(date +%u) -eq 7 && /root/runbackups/tar_week
1 0 2-31 * * root test $(date +%u) -ne 7 && /root/runbackups/tar_day

gardarea51

Хм... вот оно как. Как я понял это сравнение, при условии верности первой команды до && вторая тоже выполняется. Но интересно почему же у меня была попытка сделать дневной бэкап, когда указано, что делается он в 2-31 дни месяца.

По поводу ИЛИ, смотрю примеры из сети:
0,15,30,45 0,6,12,18 1,15,31 * 1-5  В 00:00, 00:15, 00:30, 00:45, 06:00, 06:15, 06:30,
                                  06:45, 12:00, 12:15, 12:30, 12:45, 18:00, 18:15,
                                  18:30, 18:45, если сейчас 1-е, 15-е или 31-е число
                                  любого месяца и только по рабочим дням недели

Получается что это не должно сработать? Попробую воспользоваться вашим вариантом. =)

Еще немного погуглил и отыскал, цитирую:
ЦитироватьДень выполнения можно задать двумя способами: днем месяца и днем недели. Для однозначного задания дня выполнения следует заполнять одно из полей *. В этом случае * не рассматривается cron'ом как диапазон, наоборот cron будет это поле игнорировать. Если заданы и день месяца и день недели, то программа будет выполняться и в указанные дни недели и в указанные дни месяца.
Получается, что у меня
Цитировать1 0 2-31 * 1-6   root /root/runbackups/tar_day
выполнилась, потому что сегодня пятница.

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

rayanAyar

Цитата: gardarea51 от 01 февраля 2013, 09:51:42День выполнения можно задать двумя способами: днем месяца и днем недели. Для однозначного задания дня выполнения следует заполнять одно из полей *. В этом случае * не рассматривается cron'ом как диапазон, наоборот cron будет это поле игнорировать. Если заданы и день месяца и день недели, то программа будет выполняться и в указанные дни недели и в указанные дни месяца.
Да, это перевод вот этого:
Цитата: rayanAyar от 01 февраля 2013, 09:08:36man 5 crontab

gardarea51

Ман посмотрел, но с английским у меня конечно беда. Бэкап сделался по расписанию верно, но.. другая проблема - cron не смог найти команды, воспользовавшись вашим советом, скопировал строки с /etc/crontab и поменял sh на bash
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

45 13 1    * * root /root/runbackups/tar_month >> /root/runbackups/.log 2>&1
45 13 2-31 * * root test $(date +%u) -eq 7 && /root/runbackups/tar_week >> /root/runbackups/.log 2>&1
45 13 2-31 * * root test $(date +%u) -ne 7 && /root/runbackups/tar_day >> /root/runbackups/.log 2>&1

Сейчас проверяю, пока что вроде все работает как нужно. Спасибо за помощь!  :)

lisss

Честно говоря, cron довольно неповоротлив. Намучавшись с его выкрутасами, перешел на anacron (на этом форуме и посоветовали) + более сложные скрипты на bash с определением даты и времени.

gardarea51

#6
Снова поднимаю тему. Не хочет выполняться паразит, видимо не переваривает выражение на проверку даты. Текущий формат файла крона для бэкапов:
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

1 0 1    * * root /root/runbackups/tar_month >> /root/runbackups/.log 2>&1
1 0 2-31 * * root if [ $(date +%u) -eq 7 ] ; then /root/runbackups/tar_week >> /root/runbackups/.log 2>&1 ; fi
1 0 2-31 * * root if [ $(date +%u) -ne 7 ] ; then /root/runbackups/tar_day >> /root/runbackups/.log 2>&1 ; fi
И вот что крон говорит по этому поводу в лог:
Feb  5 00:01:01 smb /USR/SBIN/CRON[26868]: (root) CMD (if [ $(date +)
Feb  5 00:01:01 smb /USR/SBIN/CRON[26869]: (root) CMD (if [ $(date +)
Feb  5 00:01:01 smb /USR/SBIN/CRON[26866]: (CRON) error (grandchild #26868 failed with exit status 1)
Feb  5 00:01:01 smb /USR/SBIN/CRON[26865]: (CRON) error (grandchild #26869 failed with exit status 1)
Feb  5 00:01:01 smb /USR/SBIN/CRON[26866]: (CRON) info (No MTA installed, discarding output)
Feb  5 00:01:01 smb /USR/SBIN/CRON[26865]: (CRON) info (No MTA installed, discarding output)

Он где-то по пути теряет %u из даты или я что-то не понимаю.. То же самое было при использовании конструкции с test, сообщения были такими:
Feb  4 00:01:01 smb /USR/SBIN/CRON[21280]: (root) CMD (test $(date +)
Feb  4 00:01:01 smb /USR/SBIN/CRON[21281]: (root) CMD (test $(date +)
Feb  4 00:01:01 smb /USR/SBIN/CRON[21279]: (CRON) error (grandchild #21280 failed with exit status 1)
Feb  4 00:01:01 smb /USR/SBIN/CRON[21278]: (CRON) error (grandchild #21281 failed with exit status 1)
Feb  4 00:01:01 smb /USR/SBIN/CRON[21278]: (CRON) info (No MTA installed, discarding output)
Feb  4 00:01:01 smb /USR/SBIN/CRON[21279]: (CRON) info (No MTA installed, discarding output)


Сообщение объединено: 05 февраля 2013, 07:46:54

Все, сам же себе и отвечаю, видимо по синтаксису не прошло, нужно было писать $(date +\%u), то есть ставить обратный слэш, погуглил, посмотрел в кронтабе mdadm и сделал так же, работает. =) Ура.

rayanAyar

Не совсем по основному вопросу, но в продолжение темы...
Я вижу "No MTA installed". Это зря. Рекомендую поставить. И проверять почту. Иногда система интересные ошибки может по почте прислать. :)

gardarea51

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