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分以内にメールが届きません。
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
デーモンに何か問題があります。
CRONは次のようになります。
*/5 * * * *
CronWTF は、CRON設定をテストする必要がある場合に非常に便利です。
出力をログファイルにパイプすることをお勧めします。これにより、スクリプトでエラーがスローされているかどうかを確認できます。ターミナルでエラーが表示されないためです。
また、PHPファイルの先頭でシバンを使用してみてください。これにより、システムはPHPの場所を認識できます。といった:
#!/usr/bin/php
そうすれば、このように全部を呼び出すことができます
*/5 * * * * php /path/to/script.php > /path/to/logfile.log
1時間ごとに10分に実行するようにcronを設定しています。every 5 mins
に設定するには、*/5 * * * * /usr/bin/php /mydomain.in/cronmail.php > /dev/null 2>&1
に変更します
cronjobが機能しているかどうかを確認する2つの手順:
Phpコマンドを手動で実行します。
/ usr/bin/php /mydomain.in/cromail.php
エラーが表示されるかどうかを確認します
# .---------------- 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
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
はn
の値を表し、m
はn
または*
より小さい値を表します。これは、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 '以降の42
nd分ごとに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秒未満の精度はありません