2016-01-13 1 views
0

Как установить cron для выполнения каждые 10 days, начиная с 16th January? Достаточно ли этого?Установите cron каждые 10 дней, начиная с 16 января

30 7 16-15/10 * * command >/dev/null 

Вышеприведенные начинается в 7.30 AM, 16th of every month и заканчивается на next month 15th и повторяет каждый 10 days. Я не думаю, что то, что у меня выше, является правильным. Может ли кто-нибудь сказать мне, как настроить cron так, чтобы были приняты во внимание месячные окончания, и каждая 10 days команда выполняется начиная с 16th January this year 2016 ?.

+1

cron действительно не оборудован для обработки этой логики. Вам лучше запускать скрипт-оболочку каждый день, который проверяет дату и отменяет или продолжает по мере необходимости. –

+0

@WilliamPursell Искал много и понял, что не может .. Я написал кое-что, что хватит для диапазона дат начиная с 6 января 2016 года по 31 декабря 2016 года. Я написал 7 команд cron. 30 7 6,16,26 1,3 * команда>/DEV/нуль 30 7 5,15,25 2,4,5 * команда>/DEV/нуль 30 7 4,14,24 6 , 7 * команда>/DEV/нуль 30 7 3,13,23 8 * команда>/DEV/нуль 30 7 2,12,22 9,10 * команда>/DEV/нуль 30 7 1 , 11,21 11,12 * команда>/dev/null 30 7 31 12 * команда>/dev/null 2016 также високосный год. Я знаю, что это смешно, но я новичок и нуждаюсь в написании сценария. Я изменю его в следующем году. – jai

+0

Вы хотите, чтобы он запускался 16 января следующего года или каждые 10 дней на неопределенный срок? –

ответ

0

Как предложил Уильям, cron не может справиться с этой сложностью сам по себе. Тем не менее, вы можете запускать работу cron чаще и использовать что-то еще для логики. Например;

30 7 16-31 1 * date '+\%j' | grep -q '0$' && yourcommand 
30 7 * 2-12 * date '+\%j' | grep -q '0$' && yourcommand 

Эта строка формата даты печатает день года, от 001 до 365. grep -q будет делать по шаблону, не печатает результаты, но возвращает успех отказа на основании того, что он находит , Каждые 10 дней день года заканчивается на ноль. В те дни yourcommand запускается.

У этого есть проблема с переходом года. Более сложной альтернативой может быть сделать аналогичный grep на продукте date '+%s' (эпоха второй), но вам нужно будет сделать математику, чтобы превратить секунды в дни для анализа на grep. Это может работать (вы должны проверить):

SHELL=/bin/bash 

30 7 * * * echo $(($(date '+%s')/86400)) | grep '0$' && yourcommand 

(Добавить Jan 16 логика, конечно, тоже.)

Это зависит от того, что обстреливать арифметика может обрабатывать только целые числа. Оболочка просто усекает, а не округляет.


UPDATE

В комментарии на другой ответ, вы уточнить ваши требования:

Команда должна начать выполнение 16-го января, и по-прежнему, как 26 января, 5 февраля , 15 февраля и т. Д. - jai

Для этого эпох-второй подход вероятно, в правильном направлении.

% date -v1m -v16d -v7H -v30M -v0S '+%s' 
1452947400 

(я в FreeBSD, следовательно, эти аргументы date.)

SHELL=/bin/bash 

30 7 * * * [[ $((($(date '+\%s') - 1452947400) \% 864000)) == 0 ]] && yourcommand 

Это выражение вычитает эпоху секунду 7.30 16 января (мой часовой пояс) от текущего времени, и проверяет, является ли полученная разность делится на 10 дней. Если это так, выражение оценивает значение true, и ваша команда запускается. Обратите внимание, что $((0 % $x)) оценивает 0 при любом значении $ x.

Это может быть связано с ошибкой, если cron особенно занят и не может добраться до вашей работы за одну секунду, когда математика работает.

Если вы хотите сделать это более сложным (и, возможно, даже если это этот комплекс), я рекомендую вам переместить логику в отдельный сценарий оболочки для обработки математики сравнения дат. Особенно, если вы планируете добавить фактор выдумки, чтобы задания могли пропустить их 1-секундное окно .. это, вероятно, будет несколько строк сценария, что неудобно поддерживать в одной записи cronjob.

+0

На самом деле мой полный cron может быть примерно таким: 30 7 * * * php command emailid $ (date "+ \% D ") команда - команда laravel, которая берет дату и адрес электронной почты в качестве параметров и генерирует отчет для транзакций за предыдущие 10 дней. Раньше я этого не говорил. Если текущая дата - 16 января 2016 года, то, если cron выполняется, команда генерирует отчет для всех транзакций с 6-го по 15-й. Если я могу выполнить команду каждый день и проверить, не отличается ли количество дней между параметром даты и 6 января 2016 года числом, равным 10, тогда сгенерируйте отчет, иначе просто верните. – jai

0
0 30 7 1/10 * ? * command >/dev/null 

Выход для вышеприведенного курьерским,

Saturday, January 16, 2016 7:30 AM 
    1. Thursday, January 21, 2016 7:30 AM 
    2. Sunday, January 31, 2016 7:30 AM 
    3. Monday, February 1, 2016 7:30 AM 
    4. Thursday, February 11, 2016 7:30 AM 
    5. Sunday, February 21, 2016 7:30 AM 

Выход для выражения

i.e 30 7 16-15/10 * * command >/dev/null 

    2016-01-15 07:30:00 
    2016-02-15 07:30:00 
    2016-03-15 07:30:00 
    2016-04-15 07:30:00 
    2016-05-15 07:30:00 
    2016-06-15 07:30:00 
    2016-07-15 07:30:00 
    2016-08-15 07:30:00 
    2016-09-15 07:30:00 
    2016-10-15 07:30:00 

Ближайший синтаксис хотел бы это:

30 7 1-30/10 * * 
30 7 1-31/10 * * 
30 7 1-28/10 * * 
30 7 1-29/10 * * 

Вы можете протестировать выражение cron http://cron.schlitt.info/

+0

Команда должна начинаться с 16 января и продолжаться как 26 января, 5 февраля, 15 февраля и т. Д. – jai

0

Наблюдение: математические возможности cron находятся рядом с несуществующим. Математические возможности инструментов Unix бесконечны.

Заключение: переместите проблему из домена cron в домен оболочки.

Решение: запустить этот каждый день с 30 7 * * * /path/to/script в кронтабе:

#!/bin/sh 
PATH=$(/usr/bin/getconf PATH) 
if test $(($(date +%j) % 10)) = 6; then 
    your_command 
fi 

Это проверяет, является ли день-года по модулю 10 есть 6, как это на 16 января (и 6 января является уже в прошлом ...).

Мышление вне коробки: Устраните ваше требование. Убедите того, кто придумал этот забавный 10-дневный цикл, чтобы принять семидневный цикл. Так проще для cron. Это следует принципу KISS.

+0

На самом деле мой полный cron может быть примерно таким: 30 7 * * * php command emailid $ (date "+ \% D") Команда - это команда laravel, которая берет дату и адрес электронной почты как параметры и генерирует отчет для транзакции предыдущих 10 дней. Раньше я этого не говорил. Если текущая дата - 16 января 2016 года, то, если cron выполняется, команда генерирует отчет для всех транзакций с 6-го по 15-й. Если я могу выполнить команду каждый день и проверить, не отличается ли количество дней между параметром даты и 6 января 2016 года числом, равным 10, тогда сгенерируйте отчет, иначе просто верните. – jai

Смежные вопросы