How can I set cron to run certain commands every one and a half hours?

前端 未结 9 1226
走了就别回头了
走了就别回头了 2020-11-27 18:42

How can I set cron to run certain commands every one and a half hours?

相关标签:
9条回答
  • 2020-11-27 18:48

    That's not possible with a single expression in normal cron.

    The best you could do without modifying the code is:

    0 0,3,6,9,12,15,18,21 * * *  [cmd]
    30 1,4,7,10,13,16,19,22 * * * [cmd]
    

    These might be compressible, depending on the version of cron you have to:

    0 */3 * * * [cmd]
    30 1-23/3 * * * [cmd]
    
    0 讨论(0)
  • 2020-11-27 18:54

    Is there a good reason why you can't use 1 hour or 2 hours? It would be simpler for sure.

    I haven't tried this personally, but you can find some info here on getting cron to run every 90 minutes: http://keithdevens.com/weblog/archive/2004/May/05/cron

    An excert from the above link:

    0 0,3,6,9,12,15,18,21 * * * <commands>
    30 1,4,7,10,13,16,19,22 * * * <commands>
    
    0 讨论(0)
  • 2020-11-27 18:54

    You could also use fcron which also accepts more complex time specifications such as :

    @ 01h30 my_cmd
    
    0 讨论(0)
  • 2020-11-27 18:57

    added the following to my crontab and is working

    15 */1   * * *   root    /usr/bin/some_script.sh >> /tmp/something.log
    
    0 讨论(0)
  • 2020-11-27 19:00

    You can achieve any frequency if you count the minutes(, hours, days, or weeks) since Epoch, add a condition to the top of your script, and set the script to run every minute on your crontab:

    #!/bin/bash
    
    minutesSinceEpoch=$(($(date +'%s / 60')))
    
    # every 90 minutes (one and a half hours)
    if [[ $(($minutesSinceEpoch % 90)) -ne 0 ]]; then
        exit 0
    fi
    

    date(1) returns current date, we format it as seconds since Epoch (%s) and then we do basic maths:

    # .---------------------- bash command substitution
    # |.--------------------- bash arithmetic expansion
    # || .------------------- bash command substitution
    # || |  .---------------- date command
    # || |  |   .------------ FORMAT argument
    # || |  |   |      .----- formula to calculate minutes/hours/days/etc is included into the format string passed to date command
    # || |  |   |      |
    # ** *  *   *      * 
      $(($(date +'%s / 60')))
    # * *  ---------------
    # | |        | 
    # | |        ·----------- date should result in something like "1438390397 / 60"
    # | ·-------------------- it gets evaluated as an expression. (the maths)
    # ·---------------------- and we can store it
    

    And you may use this approach with hourly, daily, or monthly cron jobs:

    #!/bin/bash
    # We can get the
    
    minutes=$(($(date +'%s / 60')))
    hours=$(($(date +'%s / 60 / 60')))
    days=$(($(date +'%s / 60 / 60 / 24')))
    weeks=$(($(date +'%s / 60 / 60 / 24 / 7')))
    
    # or even
    
    moons=$(($(date +'%s / 60 / 60 / 24 / 656')))
    
    # passed since Epoch and define a frequency
    # let's say, every 7 hours
    
    if [[ $(($hours % 7)) -ne 0 ]]; then
        exit 0
    fi
    
    # and your actual script starts here
    
    0 讨论(0)
  • 2020-11-27 19:02

    You could do it with two crontab entries. Each runs every three hours and they are offset by 90 minutes something like this:

    0 0,3,6,9,12,15,18,21 * * *

    30 1,4,7,10,13,16,19,22 * * *

    0 讨论(0)
提交回复
热议问题