web-dev-qa-db-ja.com

特定のコマンドを1時間半ごとに実行するようにcronを設定するにはどうすればよいですか?

特定のコマンドを1時間半ごとに実行するようにcronを設定するにはどうすればよいですか?

28
Nick Long

これは、通常のcronの単一の式では不可能です。

コードを変更せずにできる最善の方法は次のとおりです。

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

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

これらmightは圧縮可能であり、必要なcronのバージョンによって異なります。

0 */3 * * * [cmd]

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

36
Alnitak

1時間または2時間使用できない理由はありますか?それは確かに簡単でしょう。

私はこれを個人的に試したことはありませんが、cronを90分ごとに実行する方法については、こちらで情報を確認できます。 http://keithdevens.com/weblog/archive/2004/May/05/cron

上記のリンクのexcert:

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

Crontabの2行。以下に沿って:

0 0,3,6,9,12,15,18,21 * * * /usr/bin/foo
30 1,4,7,10,13,16,19,22 * * * /usr/bin/foo
#! /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
1
user3174711

これは、2つのcrontabエントリで実行できます。それぞれが3時間ごとに実行され、次のように90分オフセットされます。

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

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

1
Thomas DeGan

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

90 —分単位で1時間半

"> 60" —スクリプトの開始を1分間遅らせる機能をcronに付与します

また、このハックの助けを借りて、あなたは分の解像度で任意の期間を設定することができます

たとえば、71分ごとにスクリプトを開始します

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

1
Alex

fcron を使用することもできます。これは、次のようなより複雑な時間指定も受け入れます。

@ 01h30 my_cmd
0

Epoch 以降の分(、時間、日、または週)をカウントし、スクリプトの先頭に条件を追加し、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) 現在の日付を返します。エポック(_%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's say, every 7 hours

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

# and your actual script starts here
_
0
stefanmaric