crontab последний день месяца

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модератор: SLEDopit

Аватара пользователя
bars
Сообщения: 397
ОС: BSD/LINUX

crontab последний день месяца

Сообщение bars »

Добрый вечер.
Как реализовать запуск если допустим нужно запускать скрипт кроме 1 числа месяца?
Не во всех месяцах есть 30-31 и даже в некоторых нет 29 числа в том же феврале.
По субботам и кроме первого числа месяца.

Код: Выделить всё

40 2 2,31 * 6 
Будет ли работать такая настройка?
Система FreeBSD.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:

Аватара пользователя
olecya
Сообщения: 426
ОС: debian, fedora (i3-wm)

Re: crontab последний день месяца

Сообщение olecya »

Надо задать диапазон

Код: Выделить всё

40 2 2-31 * 6
Спасибо сказали:

Аватара пользователя
bars
Сообщения: 397
ОС: BSD/LINUX

Re: crontab последний день месяца

Сообщение bars »

olecya писала:
02.04.2021 21:18
Надо задать диапазон

Код: Выделить всё

40 2 2-31 * 6
Ага, спасибо.
Запамятовал, что запятая просто перечисляет какие именно даты, а не диапазон.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:

Аватара пользователя
bars
Сообщения: 397
ОС: BSD/LINUX

Re: crontab последний день месяца

Сообщение bars »

Доброе утро.
Система FreeBSD.
Столкнулся с делемой.
Есть 3 правила загрузки бэкапа в в облока яндекса.
в кроне.

Код: Выделить всё

#clod_YD
# Раз в месяц 1 числа.
40 2 1 * * sh /root/cloud_YD/mount  
# Каждую субботу кроме первого числа.
40 2 2-31 * 6 sh /root/cloud_YD/saturday
# Каждый день кроме 1 числа и субботы.
40 2 2-31 * 0-5 sh /root/cloud_YD/daily
Созданы

Код: Выделить всё

s3://backup.weekly/  в этом правиле /root/cloud_YD/saturday
s3://backup.daily/ в этом правиле /root/cloud_YD/daily
Так вот, сегодня утром решил проверить как бэкапы заливаются.
Бэкап залился, но в две директории (backup.weekly и backup.daily).
Не пойму почему так получилось?
Пути в скриптах заливки s3 проверил, все верно прописано.

Почему сработало это правило (40 2 2-31 * 6 sh /root/cloud_YD/saturday), сегодня же воскресенье.
Добавлено (08:26):
Проверил ман крона, написано (day of week 0-7 (0 or 7 is Sun, or use names)), то-есть 0 и 7 это воскресенье, значит 6 это суббота.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:

Аватара пользователя
olecya
Сообщения: 426
ОС: debian, fedora (i3-wm)

Re: crontab последний день месяца

Сообщение olecya »

0-7 это 8 дней!
1-7 или 0-6
Возможно зависит от локализации
Добавлено (10:29):
Проверила в линуксе 0 и 7 это воскресенье
Спасибо сказали:

Аватара пользователя
bars
Сообщения: 397
ОС: BSD/LINUX

Re: crontab последний день месяца

Сообщение bars »

olecya писала:
04.04.2021 10:18
0-7 это 8 дней!
1-7 или 0-6
Возможно зависит от локализации
Добавлено (04.04.2021 10:29):
Проверила в линуксе 0 и 7 это воскресенье
0 и 7 имеется ввиду что день недели воскресенье, видать для удобства сделано.
И вот не понятно, почему правило сработала (40 2 2-31 * 6 sh ).
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:

Аватара пользователя
olecya
Сообщения: 426
ОС: debian, fedora (i3-wm)

Re: crontab последний день месяца

Сообщение olecya »

bars писал:
04.04.2021 08:15
40 2 2-31 * 0-5 sh /root/cloud_YD/daily
Во фряхе также.
Похоже вот эту строчку надо изменить

Код: Выделить всё

40 2 2-31 * 1-5 /root/cloud_YD/daily
Добавлено (10:45):
bars писал:
04.04.2021 10:32
удобства сделано.
Возможно интервал получается обратный
Спасибо сказали:

Аватара пользователя
bars
Сообщения: 397
ОС: BSD/LINUX

Re: crontab последний день месяца

Сообщение bars »

olecya писала:
04.04.2021 10:43
40 2 2-31 * 1-5 /root/cloud_YD/daily
Так 0-5 как я понимаю будет учитывать воскресенье, но не должно учитываться суббота.
Вчера это правило не работало ( в субботу).
# Каждый день кроме 1 числа и субботы.
40 2 2-31 * 0-5 sh /root/cloud_YD/daily
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:

Аватара пользователя
olecya
Сообщения: 426
ОС: debian, fedora (i3-wm)

Re: crontab последний день месяца

Сообщение olecya »

Щас попробую 7-5
Добавлено (10:53):
Неполучается. Тогда только так:
1-5,7
Добавлено (10:58):
Я запуталась. Все у вас правильно выставлено.
Спасибо сказали:

Аватара пользователя
bars
Сообщения: 397
ОС: BSD/LINUX

Re: crontab последний день месяца

Сообщение bars »

решил проверить тут
40 2 2-31 * 6 sh /root/cloud_YD/saturday

https://crontab.guru/#20_2_2-31_*_6
“At 02:20 on every day-of-month from 2 through 31 and on Saturday.”
Каждый день и в субботу тоже, не понимаю я логики тогда.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 18091
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: crontab последний день месяца

Сообщение Bizdelnick »

В мане crontab(5) всё описано же.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
olecya
Сообщения: 426
ОС: debian, fedora (i3-wm)

Re: crontab последний день месяца

Сообщение olecya »

Нарыла такое решение:

Код: Выделить всё

# Каждую субботу кроме первого числа.
40 2 2-31 * * test `date +\%u` -eq 6 && sh /root/cloud_YD/saturday
# Каждый день кроме 1 числа и субботы.
40 2 2-31 * * test `date +\%u` -eq 6 || sh /root/cloud_YD/daily
В линухе работает сейчас попробую во фряхе
Добавлено (11:32):
Во FreeBSD-12 тоже работает
Добавлено (12:03):
@Bizdelnick. Спасибо. Действует как логическое или:
Note: The day of a command's execution can be specified in the following two fields — 'day of month', and 'day of week'.
If both fields are restricted (i.e., do not contain the "*" character), the command will be run when either field matches
the current time. For example,
"30 4 1,15 * 5" would cause a command to be run at 4:30 am on the 1st and 15th of each month, plus every Friday.
Спасибо сказали:

Аватара пользователя
bars
Сообщения: 397
ОС: BSD/LINUX

Re: crontab последний день месяца

Сообщение bars »

olecya писала:
04.04.2021 11:25
# Каждую субботу кроме первого числа.
40 2 2-31 * * test `date +\%u` -eq 6 && sh /root/cloud_YD/saturday
# Каждый день кроме 1 числа и субботы.
40 2 2-31 * * test `date +\%u` -eq 6 || sh /root/cloud_YD/daily
А что означают || ?
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:

Аватара пользователя
olecya
Сообщения: 426
ОС: debian, fedora (i3-wm)

Re: crontab последний день месяца

Сообщение olecya »

bars писал:
04.04.2021 12:39
А что означают || ?
Логическое ИЛИ. Можно применить И если поставить в test -ne #no equal

Код: Выделить всё

# Каждый день кроме 1 числа и субботы.
40 2 2-31 * * test `date +\%u` -ne 6 && sh /root/cloud_YD/daily

Shell

for i in {1..5}; do
test $i -eq 4 && echo равно
test $i -eq 4 || echo не равно
done
не равно
не равно
не равно
равно
не равно
Спасибо сказали:

Аватара пользователя
bars
Сообщения: 397
ОС: BSD/LINUX

Re: crontab последний день месяца

Сообщение bars »

olecya писала:
04.04.2021 13:20
test `date +\%u` -ne 6
А можно подробнее пояснить, что делает команда test `date +\%u` -ne 6
Что делает test и почему она в связке используется с моим скриптом?
На мой взгляд одинаковые правила.
# Каждую субботу кроме первого числа.

Код: Выделить всё

40 2 2-31 * * test `date +\%u` -eq 6 && sh /root/cloud_YD/saturday
# Каждый день кроме 1 числа и субботы.
40 2 2-31 * * test `date +\%u` -eq 6 || sh /root/cloud_YD/daily
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:

Аватара пользователя
olecya
Сообщения: 426
ОС: debian, fedora (i3-wm)

Re: crontab последний день месяца

Сообщение olecya »

bars писал:
04.04.2021 15:37
test `date +\%u` -eq 6 && sh /root/cloud_YD/saturday
Вот эта часть строчки это одна составная команда или однострочный скрипт
команда test в зависимости от оболочки может быть встроенной и не зависимо от оболочки внешней.
В задании crontab рекомендуется обычно использовать полные пути к командам. У меня работает и так, но
следующий вариант будет в приоритете, смотрим полный путь к внешним командам:

Shell

which test
/bin/test
which date
/bin/date
Изменяем:

Код: Выделить всё

/bin/test `/bin/date +\%u` -eq 6 && sh /root/cloud_YD/saturday
Команда test проверяет условие и возвращает значение true или false соответственно.

Shell

if true; then echo правда; fi
правда
if false; then :; else echo ложь; fi
ложь
Команда date +%u выдает значение от 1 до 7 в зависимости от дня недели. Это значение мы и будем сравнивать с
воскресеньем(7) -eq 7. Что бы команда выполнялась в подоболочке и возвращала значение в строку необходимо заключить ее в обратные кавычки, это наиболее совместимый способ, аналогичный конструкции $(...)
Давайте смоделируем движение по дням недели:
И так:

Shell

for i in {1..7}; do
test `date -d+${i}day +%u` -eq 7 && echo сегодня воскресенье выполняем еженедельный скрипт
test `date -d+${i}day +%u` -eq 7 || echo сегодня не воскресенье выполняем ежедневные скрипт
done
сегодня не воскресенье выполняем ежедневный скрипт
сегодня не воскресенье выполняем ежедневный скрипт
сегодня не воскресенье выполняем ежедневный скрипт
сегодня не воскресенье выполняем ежедневный скрипт
сегодня не воскресенье выполняем ежедневный скрипт
сегодня не воскресенье выполняем ежедневный скрипт
сегодня воскресенье выполняем еженедельный скрипт
В роли вашего скрипта здесь выступает команда echo с соответствующим параметром
Добавлено (16:25):
Да и синонимом встроенной команды test является левая скобочка [
Будет аналогично:

Код: Выделить всё

if [ 1 -eq 1 ]; then echo правда; fi
if test 1 -eq 1; then echo правда; fi
Или так:

Код: Выделить всё

test 1 -eq 2 || echo ложь
[ 1 -eq 2 ] || echo ложь
Поэкспериментируйте.
Последний раз редактировалось olecya 04.04.2021 17:49, всего редактировалось 1 раз.
Спасибо сказали:

Аватара пользователя
bars
Сообщения: 397
ОС: BSD/LINUX

Re: crontab последний день месяца

Сообщение bars »

olecya писала:
04.04.2021 16:13
Команда test проверяет условие и возвращает значение true или false соответственно.
Большое спасибо, то что хотел услышать.
Раньше не приходилось использовать команду test и так исголяться с кронтабом.
Добавлено (17:16):
Либо так еще посоветовали.
# On Saturdays except the 1st.
40 2 * * 6 test $(date '+%d') -ne 1 && sh /root/cloud_YD/saturday
# Every day, except on the 1st numbers and Saturday.
40 2 * * 0-5 test $(date '+%d') -ne 1 && sh /root/cloud_YD/daily
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:

Аватара пользователя
bars
Сообщения: 397
ОС: BSD/LINUX

Re: crontab последний день месяца

Сообщение bars »

Такое правило не сработало сегодня.
40 2 * * * 6 test `date '+%d'` -ne 1 && sh /root/cloud_YD/saturday
40 2 * * * 0-5 test `date '+%d'` -ne 1 && sh /root/cloud_YD/daily
Добавлено (07:30):
странно выполняется команда в кроне.
Apr 5 02:40:00 test_loc /usr/sbin/cron[14459]: (root) CMD (0-5 test `date '+)
Apr 5 02:40:00 test_loc /usr/sbin/cron[14461]: (root) CMD (6 test `date '+)
Добавлено (07:50):
Сделал так запись в кроне.
40 2 * * 6 [ "$(date '+\%d')" -ne 1 ] && sh /root/cloud_YD/saturday
40 2 * * 0-5 [ "$(date '+\%d')" -ne 1 ] && sh /root/cloud_YD/daily
Так я думаю будет правильнее.
И так по крайне мере работает.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали: