Подтвердить что ты не робот

Как я могу установить cron для запуска определенных команд каждые полтора часа?

Как установить cron для запуска определенных команд каждые полтора часа?

4b9b3361

Ответ 1

Это невозможно с одним выражением в нормальном cron.

Лучшее, что вы могли бы сделать без изменения кода:

0 0,3,6,9,12,15,18,21 * * * [cmd]

30 1,4,7,10,13,16,19,22 * * * [cmd]

Они могут быть сжимаемыми, в зависимости от версии cron, которую вы должны:

0 */3 * * * [cmd]

30 1-23/3 * * * [cmd]

Ответ 2

Есть ли веская причина, почему вы не можете использовать 1 час или 2 часа? Это было бы проще.

Я не пробовал это лично, но здесь вы можете найти информацию о том, как cron запускается каждые 90 минут: http://keithdevens.com/weblog/archive/2004/May/05/cron

Вывод из ссылки:

0 0,3,6,9,12,15,18,21 * * * <commands>
30 1,4,7,10,13,16,19,22 * * * <commands>

Ответ 3

Две линии в кронтабе. По строкам:

0 0,3,6,9,12,15,18,21 * * * /usr/bin/foo
30 1,4,7,10,13,16,19,22 * * * /usr/bin/foo

Ответ 4

Вы можете сделать это с помощью двух записей crontab. Каждый из них запускается каждые три часа, и они компенсируются на 90 минут примерно так:

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

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

Ответ 5

#! /bin/sh

# Minute Cron
# Usage: cron-min start
# Copyright 2014 by Marc Perkel
# docs at http://wiki.junkemailfilter.com/index.php/How_to_run_a_Linux_script_every_few_seconds_under_cron"
# Free to use with attribution

# Run this script under Cron once a minute

basedir=/etc/cron-min

if [ $# -gt 0 ]
then
   echo
   echo "cron-min by Marc Perkel"
   echo
   echo "This program is used to run all programs in a directory in parallel every X minutes."
   echo
   echo "Usage: cron-min"
   echo
   echo "The scheduling is done by creating directories with the number of minutes as part of the"
   echo "directory name. The minutes do not have to evenly divide into 60 or be less than 60."
   echo
   echo "Examples:"
   echo "  /etc/cron-min/1      # Executes everything in that directory every 1  minute"
   echo "  /etc/cron-min/5      # Executes everything in that directory every 5  minutes"
   echo "  /etc/cron-min/13     # Executes everything in that directory every 13 minutes"
   echo "  /etc/cron-min/90     # Executes everything in that directory every 90 minutes"
   echo
   exit
fi

for dir in $basedir/* ; do
   minutes=${dir##*/}
   if [ $(( ($(date +%s) / 60) % $minutes )) -eq 0 ]
   then
      for program in $basedir/$minutes/* ; do
     if [ -x $program ]
     then
        $program &> /dev/null &
     fi
      done
   fi
done

Ответ 6

*/10 * * * * root perl -e 'exit(time()%(90*60)>60)' && command

90 - это полтора часа в минутах

" > 60" - я даю способности cron отсрочить начало script в течение минуты

Также с помощью этого хака вы можете установить любой период с минимальным разрешением

Например, запустите script каждые 71 минуту

* * * * * root perl -e 'exit(time()%(71*60)>60)' && command

Ответ 7

Вы также можете использовать fcron, который также принимает более сложные спецификации времени, такие как:

@ 01h30 my_cmd

Ответ 8

Вы можете достичь любой частоты, если подсчитываете минуты (часы, дни или недели) с Epoch, добавьте условие наверху вашего script и установите script для запуска каждую минуту на вашем 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) возвращает текущую дату, мы отформатируем ее как секунды с Epoch (%s), а затем делаем основные математические данные:

# .---------------------- 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

И вы можете использовать этот подход с почасовыми, ежедневными или месячными заданиями cron:

#!/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 say, every 7 hours

if [[ $(($hours % 7)) -ne 0 ]]; then
    exit 0
fi

# and your actual script starts here

Ответ 9

добавил к моему crontab следующее:

15 */1   * * *   root    /usr/bin/some_script.sh >> /tmp/something.log