Автор Тема: Запуск задач по cron, все ли правильно или где-то ошибка?  (Прочитано 7898 раз)

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

Попробуйте добавить перед задачами:
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
« Последнее редактирование: 01 Февраля 2013, 09:20:53 от rayanAyar »
 

Оффлайн 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

День выполнения можно задать двумя способами: днем месяца и днем недели. Для однозначного задания дня выполнения следует заполнять одно из полей *. В этом случае * не рассматривается cron'ом как диапазон, наоборот cron будет это поле игнорировать. Если заданы и день месяца и день недели, то программа будет выполняться и в указанные дни недели и в указанные дни месяца.
Да, это перевод вот этого:
man 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

Снова поднимаю тему. Не хочет выполняться паразит, видимо не переваривает выражение на проверку даты. Текущий формат файла крона для бэкапов:
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 и сделал так же, работает. =) Ура.
« Последнее редактирование: 05 Февраля 2013, 07:46:54 от gardarea51 »
 

Оффлайн rayanAyar

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

Оффлайн gardarea51

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

Теги:
     

    Запуск OpenVPN-соединения ярлыком

    Автор Suncatcher

    Ответов: 3
    Просмотров: 2377
    Последний ответ 03 Декабря 2013, 07:06:28
    от rayanAyar
    Запуск Debian. отслеживание запуска.

    Автор mightyraven

    Ответов: 3
    Просмотров: 1503
    Последний ответ 27 Ноября 2015, 10:50:41
    от nezabudka
    повторный запуск startx

    Автор VAK

    Ответов: 13
    Просмотров: 2125
    Последний ответ 08 Декабря 2016, 08:32:15
    от yoric
    Запуск linux из GNU GRUB

    Автор blvckxboy

    Ответов: 1
    Просмотров: 1329
    Последний ответ 26 Февраля 2018, 23:13:40
    от moreplavatel
    Запуск .sh файла

    Автор Eyer

    Ответов: 25
    Просмотров: 1649
    Последний ответ 28 Января 2021, 11:46:30
    от dzhoser