Bagaimana cara menjalankan cronjob setiap X menit?

95

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.

Savan Paun
sumber
2
jalur absolut Anda mungkin tidak benar
Rene Pot
tolong sarankan saya jalan yang benar file php saya cromail.php ke direktori root - mydomain.in/cromail.php
Savan Paun
Terkadang php-cli tidak ingin berfungsi hanya karena Anda belum menyetel zona waktu saat ini di php.ini Anda meskipun Anda tidak menggunakan tanggal.
T00rk
Apakah itu cromail.phpatau cronmail.php?
Biffen
cromail.php untuk pengujian saja
Savan Paun

Jawaban:

170

Dalam sebuah crontabfile, kolomnya adalah:

  • menit dalam satu jam.
  • jam dalam sehari.
  • hari dalam sebulan.
  • bulan dari tahun.
  • hari di minggu ini.

Begitu:

10 * * * * blah

berarti mengeksekusi blahpada 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 cronfile executable lama yang tidak memahami */xnotasi.

Jika masih belum berfungsi setelah itu, ubah perintah menjadi seperti:

date >>/tmp/debug_cron_pax.txt

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 crondaemon Anda .

paxdiablo
sumber
saya memperbarui * / 5 * * * * mydomain.in/cronmail.php> / dev / null 2> & 1 Tidak menerima email
Savan Paun
Saya menggunakan perintah yang disebutkan di sini juga, tetapi tidak berfungsi karena saya memiliki pernyataan pengembalian setelahnya. Pastikan untuk tidak mengakhiri pernyataan dengan return dan juga catatan, ketika cron baru dibuat akan muncul pesan "crontab: menginstal crontab baru".
damndemon
31

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

Gary Jones
sumber
saya memperbarui * / 5 * * * * mydomain.in/cronmail.php> / dev / null 2> & 1 Tidak menerima email
Savan Paun
2
Sudahkah Anda mencoba menjalankan skrip secara manual dan bukan melalui cron? Masalahnya mungkin sebenarnya ada pada skrip itu sendiri.
Gary Jones
6

Anda menyetel cron Anda untuk berjalan pada menit ke-10 dalam setiap jam.
Untuk mengaturnya agar every 5 minsberubah menjadi*/5 * * * * /usr/bin/php /mydomain.in/cronmail.php > /dev/null 2>&1

Justinas
sumber
saya memperbarui * / 5 * * * * mydomain.in/cronmail.php> / dev / null 2> & 1 Tidak menerima email
Savan Paun
@ user3705511 Anda lupa menjalankannya melalui php - usr/bin/phpbagian yang hilang
Justinas
ditambahkan * / 5 * * * * usr / bin / php / mydomain.in / cronmail.php> / dev / null 2> & 1 tetapi masih belum menerima email
Savan Paun
@ user3705511*/5 * * * * /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1
Justinas
diperbarui tetapi masih belum menerima email * / 5 * * * * usr / bin / php / mydomain.in/cronmail.php> / dev / null 2> & 1
Savan Paun
5

Jika Anda ingin menjalankan cron setiap nmenit, ada beberapa opsi yang memungkinkan bergantung pada nilai n.

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, nmewakili nilai ndan mmewakili nilai yang lebih kecil dari natau *. Ini akan menjalankan perintah pada menitm,m+n,m+2n,...

n TIDAK membagi 60

Jika ntidak 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 sejak 1970-01-01 00:00:00 UTC. Katakanlah kita ingin menjalankan perintah pertama kali saat Marty McFly tiba di Riverdale dan mengulanginya setiap nmenit kemudian.

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

Agar cronjob berjalan setiap 42menit 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 minutetestcmddidefinisikan 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-detik

kvantour.dll
sumber
The m/nnotasi tampaknya tidak bekerja pada sistem saya (Debian 9, Ubuntu 16.04). Hanya */nbekerja. Misalnya, 5/5atau 4/10berikan Error: bad minute; while reading /etc/crontabdi syslog (di Ubuntu dengan cron v. 3.0pl1-128ubuntu2). Apakah notasi m / n ini telah ditinggalkan, atau hanya tersedia di beberapa sistem?
mivk
@mivk Terima kasih telah menunjukkan hal ini. Ini adalah kesalahan di pihak saya. Seharusnya sudah dibaca m-59/n. Hanya rentang yang dapat memiliki ukuran langkah. (lihat man 5 crontab). Saya telah memperbarui jawabannya
kvantour
3

2 langkah untuk memeriksa apakah cronjob berfungsi:

  1. Login di server dengan pengguna yang menjalankan cronjob
  2. Jalankan perintah php secara manual:

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

Dan periksa apakah ada kesalahan yang ditampilkan

Paul Giragossian
sumber
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

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
Javeed Shakeel
sumber
1
Ini TIDAK menjalankan tugas SETIAP x (15) menit. Ini berjalan pada x (1) menit setelah setiap jam penuh.
silverdr