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


94

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("myemail@gmail.com", $subject, $message, "From: $from\n");
?>

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


2
あなたの絶対パスはおそらく正しくありません
Rene Pot

私のphpファイルcromail.phpがルートディレクトリにある正しいパスを提案してください-mydomain.in/cromail.php
Savan

日付を使用しなくても、php.iniで現在のタイムゾーンを設定していないために、php-cliが機能しない場合があります。
T00rk

それはありますcromail.phpcronmail.php
Biffen

テスト専用のcromail.php
Savan

回答:


165

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

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

そう:

10 * * * * blah

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

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

*/5 * * * * blah

毎分を意味しますが、5つおきにのみ、または:

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

表記法をcron理解していない古い実行可能ファイル*/x

その後もそれでも機能しない場合は、コマンドを次のように変更します。

date >>/tmp/debug_cron_pax.txt

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


i update * / 5 * * * * mydomain.in/cronmail.php> / dev / null 2>&1メールが届かない
Savan Paun

ここで説明したコマンドも使用しましたが、その後にreturnステートメントがあったため、機能しませんでした。ステートメントをreturnとメモで終了しないようにしてください。新しいcronが作成されると、「crontab:installing new crontab」メッセージが表示されます。
damndemon

31

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

*/5 * * * *

CronWTFは、CRON設定をテストする必要がある場合に非常に役立ちます。

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

また、PHPファイルの先頭にシバンを使用して、システムがPHPの場所を認識できるようにします。といった:

#!/usr/bin/php

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

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


i update * / 5 * * * * mydomain.in/cronmail.php> / dev / null 2>&1メールが届かない
Savan Paun

2
cronではなく手動でスクリプトを実行してみましたか?問題は実際にはスクリプト自体にある可能性があります。
ゲイリージョーンズ

5

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


i update * / 5 * * * * mydomain.in/cronmail.php> / dev / null 2>&1メールが届かない
Savan Paun

@ user3705511 phpで実行するのを忘れた-欠落しているusr/bin/php部分
Justinas '09 / 09/9

* / 5 * * * * usr / bin / php / mydomain.in / cronmail.php> / dev / null 2>&1を追加しましたが、まだメールを受信して​​いません
Savan Paun

@ user3705511*/5 * * * * /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1
Justinas 2014

更新されたがまだメールを受信しない* / 5 * * * * usr / bin / php / mydomain.in/cronmail.php> / dev / null 2>&1
Savan Paun

5

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

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

n 60を割りません

nが60を除算しない場合、cronでこれをきれいに行うことはできませんが、それは可能です。これを行うには、テストが時間をチェックするcronにテストを置く必要があります。これは、UNIXのタイムスタンプ(からの合計秒数)を確認するときに最適1970-01-01 00:00:00 UTCです。Marty McFlyがRiverdaleに到着したときに最初にコマンドを実行し、その後、毎n分繰り返したいとしましょう。

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

42cronjobが「2015-10-21 07:28:00」以降1分ごとに実行される場合、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秒未満の精度はありません


このm/n表記は私のシステムでは機能しないようです(Debian 9、Ubuntu 16.04)。のみ*/n機能します。例えば、5/5若しくは4/10与えるError: bad minute; while reading /etc/crontabsyslogに(クーロンvでのUbuntuに。3.0pl1-128ubuntu2)。このm / n表記は廃止されましたか、それとも一部のシステムでのみ使用できますか?
mivk

@mivkこれを指摘してくれてありがとう。これは私の側の間違いでした。読むべきだったm-59/n。ステップサイズを持つことができるのは範囲のみです。(を参照man 5 crontab)。回答を更新しました
kvantour

3

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

1
これは、x(15)分ごとにタスクを実行することはありません。1時間おきにx(1)分実行します。
silverdr 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.