Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
循环cron任务_Cron_Crontab - Fatal编程技术网

循环cron任务

循环cron任务,cron,crontab,Cron,Crontab,我需要建立一个每周电子邮件,周期之间的4个变化,例如 变异a 然后b 然后c 然后d 然后回到一个 等 每周 我希望使用4个cron任务(每个任务每4周发送一封电子邮件)来实现这一点,但我很难将它们错开,使每个任务在不同的一周开始,而不是让它们在第一周发送电子邮件,然后在接下来的4周内什么都没有 我的crontab现在看起来像这样: 0 8 * * 1/4 echo "Variation A" | mail -s "Test email" admin@mydomain.com 0 8

我需要建立一个每周电子邮件,周期之间的4个变化,例如

  • 变异a
  • 然后b
  • 然后c
  • 然后d
  • 然后回到一个
  • 每周

    我希望使用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中)

    这不是单靠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
    

    请使用“代码”上的“代码块”按钮,它很难读取。1)在单个值(而不是范围)上使用/不会起任何作用。2) 第五个字段是
    一周中的一天
    ,而不是一个月中的一周或你想要的任何东西。或者,如果你选择一个日期和时间作为第一次运行的日期,问题就会变成无状态,因为你可以得到当前的日期和时间,然后找出你在循环中的位置。你建议的方法很好,很简单(而且可能是更好的选择)。这是一种很好的循环方法(我喜欢这样的事实,它不依赖日期为正确的一周获得正确的变化)。我想用“date+%s”,然后计算第一封电子邮件的日期和当前日期之间的差值,计算出我们目前在哪一周(但数学上有点令人不快)@Mark:这仍然是一种状态,每次跑步都不会改变。我确实考虑过这样的事情,但是我更喜欢我现在的方法,因为如果变化的数量改变了,行为仍然是正确的——跟随最后一个的行为将被发送。日期数学可能导致更改后发送任何更改,具体取决于更改日期。