【问题标题】:Cyclic cron tasks循环 cron 任务
【发布时间】:2011-05-28 00:22:06
【问题描述】:

我需要设置每周电子邮件,在 4 种变体之间循环,例如。

  1. 变体a
  2. 然后 b
  3. 然后c
  4. 然后 d
  5. 然后回到一个

每周一次。

我想使用 4 个 cron 任务(每个任务每 4 周发送一封电子邮件)来执行此操作,但我无法错开它们,以便每个任务开始在不同的一周,而不是让他们在第一周都发送电子邮件,然后在接下来的 4 周内什么都没有。

我的 crontab 目前看起来是这样的:

0  8  *  *  1/4  echo "Variation A" | mail -s "Test email" admin@mydomain.com
0  8  *  *  1/4  echo "Variation B" | mail -s "Test email" admin@mydomain.com
0  8  *  *  1/4  echo "Variation C" | mail -s "Test email" admin@mydomain.com
0  8  *  *  1/4  echo "Variation D" | mail -s "Test email" admin@mydomain.com 

我觉得如果我可以控制每个人第一次发送电子邮件的时间,那么我可以让它正常工作吗?

有人能找到更好的方法吗?最好使用最少的脚本(我想将所有细节保留在 crontab 中)

【问题讨论】:

  • 请使用“代码”上的代码块按钮,它很难阅读。
  • 1) 在单个值(不是范围)上使用 / 不会做任何事情。 2)第五个字段是day-of-week,不是每月的一周或任何你想要的。

标签: cron crontab


【解决方案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

【讨论】:

  • 或者,如果您选择一个日期和时间作为第一次运行的日期,问题就会变得无状态,因为您可以获得当前日期和时间,然后找出您在周期中的位置.不过,您建议的方式既好又简单(可能是更好的选择)。
  • 这是一种很好的循环方式(我喜欢它不依赖日期来获得正确一周的正确变化的事实)。我正在考虑使用“日期 +%s”,然后计算第一封电子邮件的日期和当前日期之间的差异,以计算出我们当前所在的星期(但数学有点令人反感)
  • @Mark:这仍然是一种状态,只是不会在每次运行时改变。我确实考虑过类似的事情,但我更喜欢我目前的方法,因为如果变化的数量发生变化,行为仍然是正确的——将发送最后一个之后的那个。日期数学可能会导致在更改后发送任何变化,具体取决于更改的日期。
猜你喜欢
  • 2011-06-04
  • 2011-04-28
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多