web-dev-qa-db-ja.com

X分ごとにcronjobを実行する方法は?

PHPスクリプトをcronjobで実行していて、5分ごとにメールを送信したい

私の現在の(crontab)cronjob:

10 * * * * /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1

Cronmail.phpは次のとおりです。

<?php
$from = 'D'; // sender
$subject = 'S';
$message = 'M';
$message = wordwrap($message, 70);
mail("[email protected]", $subject, $message, "From: $from\n");
?>

しかし、この構成では30分以内にメールが届きません。

73
Savan Paun

crontabファイルでは、フィールドは次のとおりです。

  • 時間の分。
  • 一日の時間。
  • 月の日。
  • 年の月。
  • 曜日。

そう:

10 * * * * blah

毎時10分にblahを実行することを意味します。

5分ごとに使用する場合は、次のいずれかを使用します。

*/5 * * * * blah

1分ごとに、ただし5分ごとに、または:

0,5,10,15,20,25,30,35,40,45,50,55 * * * * blah

*/x表記を理解しない古いcron実行可能ファイルの場合。

stillがその後動作しないようであれば、コマンドを次のように変更します:

date >>/tmp/debug_cron_pax.txt

そのファイルを監視して、5分ごとに何かが書き込まれていることを確認します。その場合、PHPスクリプトに何か問題があります。そうでない場合、cronデーモンに何か問題があります。

126
paxdiablo

CRONは次のようになります。

*/5 * * * *

CronWTF は、CRON設定をテストする必要がある場合に非常に便利です。

出力をログファイルにパイプすることをお勧めします。これにより、スクリプトでエラーがスローされているかどうかを確認できます。ターミナルでエラーが表示されないためです。

また、PHPファイルの先頭でシバンを使用してみてください。これにより、システムはPHPの場所を認識できます。といった:

#!/usr/bin/php

そうすれば、このように全部を呼び出すことができます

*/5 * * * * php /path/to/script.php > /path/to/logfile.log

26
Gary Jones

1時間ごとに10分に実行するようにcronを設定しています。
every 5 minsに設定するには、*/5 * * * * /usr/bin/php /mydomain.in/cronmail.php > /dev/null 2>&1に変更します

4
Justinas

cronjobが機能しているかどうかを確認する2つの手順:

  1. Cronjobを実行するユーザーでサーバーにログインします
  2. Phpコマンドを手動で実行します。

    / usr/bin/php /mydomain.in/cromail.php

エラーが表示されるかどうかを確認します

3
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR Sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

X分を設定するには、最初の引数にx分を設定してから、スクリプトのパスを設定する必要があります

15分間

*/15 * * * *  /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1
2
Javeed Shakeel

n分ごとにcronを実行する場合は、nの値に応じていくつかの可能なオプションがあります。

nは60を分割します(1、2、3、4、5、6、10、12、15、20、30)

ここでは、/表記を使用することにより、ソリューションは簡単です。

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
# |  |  |  |  |
# *  *  *  *  *   command to be executed
m-59/n  *  *  *  *   command

上記では、nnの値を表し、mnまたは*より小さい値を表します。これは、m,m+n,m+2n,...分のコマンドを実行します

nは60を分割しません

nが60を分割しない場合、cronでこれをきれいに行うことはできませんが、可能です。これを行うには、テストが時刻を確認するcronにテストを配置する必要があります。これは、1970-01-01 00:00:00 UTCからの合計秒数であるUNIXタイムスタンプを確認するときに最適です。 Marty McFlyがRiverdaleに到着したときに初めてコマンドの実行を開始し、n分ごとにコマンドを繰り返したいとします。

% date -d '2015-10-21 07:28:00' +%s 
1445412480

`2015-10-21 07:28:00 '以降の42nd分ごとにcronジョブを実行する場合、crontabは次のようになります。

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
# |  |  |  |  |
# *  *  *  *  *   command to be executed
  *  *  *  *  *   minutetestcmd "2015-10-21 07:28:00" 42 && command

minutetestcmdは次のように定義されます

#!/usr/bin/env bash
starttime=$(date -d "$1" "+%s")
# return UTC time
now=$(date "+%s")
# get the amount of minutes (using integer division to avoid lag)
minutes=$(( (now - starttime) / 60 ))
# set the modulo
modulo=$2
# do the test
(( now >= starttime )) && (( minutes % modulo == 0 ))

備考: UNIX時間はうるう秒の影響を受けません

備考:cronには1秒未満の精度はありません

1
kvantour