Циклические задачи cron

Мне нужно настроить еженедельную электронную почту, которая циклически переключается между 4 вариантами, например.

  1. вариация а
  2. тогда б
  3. тогда с
  4. тогда д
  5. затем обратно в
  6. так далее

каждую неделю.

Я хотел бы сделать это, используя 4 задачи cron (каждая из которых отправляет электронное письмо каждые 4 недели), но у меня возникают проблемы с их распределением так, чтобы каждая задача начиналась на другой неделе, а не все они отправляют свои электронные письма в первую неделю, а затем ничего не делают в течение следующих 4 недель.

Мой crontab на данный момент выглядит так:

0  8  *  *  1/4  echo "Variation A" | mail -s "Test email" [email protected]
0  8  *  *  1/4  echo "Variation B" | mail -s "Test email" [email protected]
0  8  *  *  1/4  echo "Variation C" | mail -s "Test email" [email protected]
0  8  *  *  1/4  echo "Variation D" | mail -s "Test email" [email protected] 

Я чувствую, что если бы я мог контролировать, когда каждый из них отправляет электронное письмо в первый раз, тогда я мог бы заставить его работать правильно?

Может ли кто-нибудь увидеть лучший способ сделать это? Желательно с минимумом сценариев (я бы хотел сохранить все детали в crontab)


person iainbeeston    schedule 19.12.2010    source источник
comment
Пожалуйста, используйте кнопку блокировки кода в коде, его очень трудно прочитать.   -  person plundra    schedule 20.12.2010
comment
1) Наличие /‹шага› для одного значения (не диапазона) ничего не даст. 2) Пятое поле — day-of-week, а не неделя месяца или что-то еще, что вы хотели.   -  person plundra    schedule 20.12.2010


Ответы (1)


Это не то, что вы можете сделать только с помощью cron. Для этого вам придется использовать какой-то скрипт, сохраняющий последний отправленный вами вариант и решающий, какой отправить дальше, на основе этой информации. Запись cron будет выглядеть примерно так:

0 8 * * 0 somescript.sh

Это будет выполнять скрипт в 8 утра каждое воскресенье. Сценарий сам должен будет решить, какое сообщение отправить.

Вы можете использовать что-то вроде этого:

#!/bin/sh

STATEFILE='emailstate'
VARIATION=`cat emailstate 2>/dev/null`

case "$VARIATION" in
    '4' )
        # send variation 4
        echo 'Sending variation 4'

        VARIATION='1'
        ;;

    '3' )
        # send variation 3
        echo 'Sending variation 3'

        VARIATION='4'
        ;;

    '2' )
        # send variation 2
        echo 'Sending variation 2'

        VARIATION='3'
        ;;

    *   )
        # send variation 1
        echo 'Sending variation 1'

        VARIATION='2'
        ;;
esac

echo $VARIATION > $STATEFILE
person cdhowie    schedule 20.12.2010
comment
В качестве альтернативы, если вы выберете дату и время в качестве даты первого запуска, проблема перестанет сохранять состояние, поскольку вы можете получить текущую дату и время, а затем выяснить, на каком этапе цикла вы находитесь. То, как вы предложили сделать это, красиво и просто (и, вероятно, лучше). - person Mark Simpson; 20.12.2010
comment
Это хороший циклический способ сделать это (мне нравится тот факт, что он не зависит от дат, чтобы получить правильный вариант для нужной недели). Я думал использовать дату +%s, а затем вычислить разницу между датой первого электронного письма и текущей датой, чтобы определить, на какой неделе мы сейчас находимся (но математика немного сбивает с толку) - person iainbeeston; 20.12.2010
comment
@Mark: Это все еще своего рода состояние, оно просто не будет меняться при каждом запуске. Я думал о чем-то подобном, но мой текущий подход мне нравится больше, потому что, если количество вариантов изменится, поведение по-прежнему будет правильным — будет отправлен тот, который следует за последним. Математика даты может привести к отправке любого варианта после изменения, в зависимости от даты изменения. - person cdhowie; 20.12.2010