Saya menjalankan skrip PHP di cronjob dan saya ingin mengirim email setiap 5 menit
Cronjob saya saat ini (crontab):
10 * * * * /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1
Cronmail.php adalah sebagai berikut:
<?php
$from = 'D'; // sender
$subject = 'S';
$message = 'M';
$message = wordwrap($message, 70);
mail("[email protected]", $subject, $message, "From: $from\n");
?>
Tetapi saya belum menerima email dalam 30 menit dengan konfigurasi ini.
cromail.php
ataucronmail.php
?Jawaban:
Dalam sebuah
crontab
file, kolomnya adalah:Begitu:
10 * * * * blah
berarti mengeksekusi
blah
pada 10 menit setelah setiap jam.Jika Anda ingin setiap lima menit, gunakan:
*/5 * * * * blah
artinya setiap menit tetapi hanya setiap seperlima, atau:
0,5,10,15,20,25,30,35,40,45,50,55 * * * * blah
untuk
cron
file executable lama yang tidak memahami*/x
notasi.Jika masih belum berfungsi setelah itu, ubah perintah menjadi seperti:
dan pantau file itu untuk memastikan ada sesuatu yang ditulis setiap lima menit. Jika ya, ada yang salah dengan skrip PHP Anda. Jika tidak, berarti ada yang salah dengan
cron
daemon Anda .sumber
CRON Anda akan terlihat seperti ini:
*/5 * * * *
CronWTF sangat berguna ketika Anda perlu menguji pengaturan CRON Anda.
Mungkin ide yang bagus untuk menyalurkan output ke file log sehingga Anda dapat melihat apakah skrip Anda juga menampilkan kesalahan - karena Anda tidak akan melihatnya di terminal.
Coba juga menggunakan shebang di bagian atas file PHP Anda, sehingga sistem tahu di mana menemukan PHP. Seperti:
#!/usr/bin/php
dengan cara itu Anda bisa menyebut semuanya seperti ini
*/5 * * * * php /path/to/script.php > /path/to/logfile.log
sumber
Anda menyetel cron Anda untuk berjalan pada menit ke-10 dalam setiap jam.
Untuk mengaturnya agar
every 5 mins
berubah menjadi*/5 * * * * /usr/bin/php /mydomain.in/cronmail.php > /dev/null 2>&1
sumber
usr/bin/php
bagian yang hilang*/5 * * * * /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1
Jika Anda ingin menjalankan cron setiap
n
menit, ada beberapa opsi yang memungkinkan bergantung pada nilain
.n
membagi 60 (1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30)Di sini, solusinya langsung dengan menggunakan
/
notasi:# 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
Di atas,
n
mewakili nilain
danm
mewakili nilai yang lebih kecil darin
atau*
. Ini akan menjalankan perintah pada menitm,m+n,m+2n,...
n
TIDAK membagi 60Jika
n
tidak membagi 60, Anda tidak dapat melakukan ini dengan rapi dengan cron tetapi itu mungkin. Untuk melakukan ini, Anda perlu menguji di cron tempat tes memeriksa waktu. Ini paling baik dilakukan saat melihat stempel waktu UNIX, total detik sejak1970-01-01 00:00:00 UTC
. Katakanlah kita ingin menjalankan perintah pertama kali saat Marty McFly tiba di Riverdale dan mengulanginya setiapn
menit kemudian.% date -d '2015-10-21 07:28:00' +%s 1445412480
Agar cronjob berjalan setiap
42
menit setelah `2015-10-21 07:28:00 ', crontabnya akan terlihat seperti ini:# 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
dengan
minutetestcmd
didefinisikan sebagai#!/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 ))
Catatan: Waktu UNIX tidak dipengaruhi oleh detik kabisat
Catatan:
cron
tidak memiliki akurasi sub-detiksumber
m/n
notasi tampaknya tidak bekerja pada sistem saya (Debian 9, Ubuntu 16.04). Hanya*/n
bekerja. Misalnya,5/5
atau4/10
berikanError: bad minute; while reading /etc/crontab
di syslog (di Ubuntu dengan cron v. 3.0pl1-128ubuntu2). Apakah notasi m / n ini telah ditinggalkan, atau hanya tersedia di beberapa sistem?m-59/n
. Hanya rentang yang dapat memiliki ukuran langkah. (lihatman 5 crontab
). Saya telah memperbarui jawabannya2 langkah untuk memeriksa apakah cronjob berfungsi:
Jalankan perintah php secara manual:
/ usr / bin / php /mydomain.in/cromail.php
Dan periksa apakah ada kesalahan yang ditampilkan
sumber
# .---------------- 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
Untuk mengatur x menit kita perlu mengatur x menit dalam argumen pertama dan kemudian jalur skrip Anda
Selama 15 menit
*/15 * * * * /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1
sumber