จะเรียกใช้ cronjob ทุก X นาทีได้อย่างไร?


95

ฉันใช้สคริปต์ PHP ใน cronjob และฉันต้องการส่งอีเมลทุก ๆ 5 นาที

cronjob (crontab) ปัจจุบันของฉัน:

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 Paun

บางครั้ง php-cli ไม่ต้องการทำงานเพียงเพราะคุณไม่ได้ตั้งเขตเวลาปัจจุบันใน php.ini แม้ว่าคุณจะไม่ได้ใช้วันที่ก็ตาม
T00rk

มันcromail.phpหรือcronmail.php?
Biffen

cromail.php สำหรับการทดสอบเท่านั้น
Savan Paun

คำตอบ:


170

ในcrontabไฟล์ฟิลด์คือ:

  • นาทีของชั่วโมง
  • ชั่วโมงของวัน
  • วันของเดือน
  • เดือนของปี.
  • วันของสัปดาห์.

ดังนั้น:

10 * * * * blah

หมายถึงดำเนินการblahที่ 10 นาทีที่ผ่านมาทุกชั่วโมง

หากคุณต้องการทุกๆห้านาทีให้ใช้อย่างใดอย่างหนึ่ง:

*/5 * * * * blah

หมายถึงทุกนาที แต่จะมีเพียงหนึ่งในห้าเท่านั้นหรือ:

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

สำหรับcronไฟล์ปฏิบัติการรุ่นเก่าที่ไม่เข้าใจ*/xสัญกรณ์

หากยังดูเหมือนว่าจะไม่ทำงานหลังจากนั้นให้เปลี่ยนคำสั่งเป็นดังนี้:

date >>/tmp/debug_cron_pax.txt

และตรวจสอบไฟล์นั้นเพื่อให้แน่ใจว่ามีการเขียนบางสิ่งทุกๆห้านาที ถ้าเป็นเช่นนั้นสคริปต์ PHP ของคุณมีบางอย่างผิดปกติ ถ้าไม่มีแสดงว่าcronภูตของคุณมีอะไรผิดปกติ


ฉันอัปเดต * / 5 * * * * mydomain.in/cronmail.php> / dev / null 2> & 1 ไม่ได้รับอีเมล
Savan Paun

ฉันใช้คำสั่งที่กล่าวถึงที่นี่เช่นกัน แต่มันไม่ทำงานเพราะฉันมีคำสั่งส่งคืนหลังจากนั้น อย่าปิดท้ายคำสั่งด้วย return และหมายเหตุเมื่อสร้าง cron ใหม่จะแสดงข้อความ "crontab: installation new crontab"
damndemon

31

CRON ของคุณควรมีลักษณะดังนี้:

*/5 * * * *

CronWTFมีประโยชน์มากเมื่อคุณต้องการทดสอบการตั้งค่า CRON ของคุณ

อาจเป็นความคิดที่ดีที่จะไพพ์เอาต์พุตลงในล็อกไฟล์เพื่อให้คุณสามารถดูได้ว่าสคริปต์ของคุณมีข้อผิดพลาดหรือไม่เนื่องจากคุณจะไม่เห็นในเทอร์มินัลของคุณ

ลองใช้ shebang ที่ด้านบนของไฟล์ PHP เพื่อให้ระบบรู้ว่าจะหา PHP ได้จากที่ใด เช่น:

#!/usr/bin/php

ด้วยวิธีนี้คุณสามารถเรียกสิ่งทั้งหมดนี้ได้

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


ฉันอัปเดต * / 5 * * * * mydomain.in/cronmail.php> / dev / null 2> & 1 ไม่ได้รับอีเมล
Savan Paun

2
คุณได้ลองเรียกใช้สคริปต์ด้วยตนเองและไม่ผ่าน cron หรือไม่? จริงๆแล้วปัญหาอาจเกิดจากตัวสคริปต์เอง
Gary Jones

6

คุณกำลังตั้งค่า cron ของคุณให้ทำงานในนาทีที่ 10 ในทุกๆชั่วโมง
เพื่อตั้งค่าให้every 5 minsเปลี่ยนเป็น*/5 * * * * /usr/bin/php /mydomain.in/cronmail.php > /dev/null 2>&1


ฉันอัปเดต * / 5 * * * * mydomain.in/cronmail.php> / dev / null 2> & 1 ไม่ได้รับอีเมล
Savan Paun

@ user3705511 คุณลืมเรียกใช้ผ่าน php - usr/bin/phpส่วนที่หายไป
Justinas

เพิ่ม * / 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

อัปเดตแล้วแต่ยังไม่ได้รับอีเมล * / 5 * * * * usr / bin / php / mydomain.in/cronmail.php> / dev / null 2> & 1
Savan Paun

5

หากคุณต้องการเรียกใช้ cron ทุกnนาทีมีตัวเลือกที่เป็นไปได้สองสามตัวเลือกขึ้นอยู่กับค่าของ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 ซึ่งการทดสอบจะตรวจสอบเวลา วิธีนี้ทำได้ดีที่สุดเมื่อดูการประทับเวลา UNIX ซึ่งเป็นจำนวนวินาทีทั้งหมดตั้งแต่1970-01-01 00:00:00 UTCนั้นมา สมมติว่าเราต้องการเริ่มเรียกใช้คำสั่งในครั้งแรกเมื่อ Marty McFly มาถึง Riverdale แล้วทำซ้ำทุก ๆnนาทีต่อมา

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

เพื่อให้ cronjob ทำงานทุก ๆ42นาทีหลังจาก `` 2015-10-21 07:28:00 '' 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ไม่มีความแม่นยำย่อยวินาที


m/nสัญกรณ์ไม่ได้ดูเหมือนจะทำงานบนระบบของฉัน (Debian 9 Ubuntu 16.04) ใช้*/nงานได้เท่านั้น ตัวอย่างเช่น5/5หรือ4/10ให้Error: bad minute; while reading /etc/crontabใน syslog (ใน Ubuntu พร้อม cron v. 3.0pl1-128ubuntu2) สัญกรณ์ m / n นี้ถูกละทิ้งหรือมีเฉพาะในบางระบบ?
mivk

@mivk ขอบคุณที่ชี้ให้เห็น นี่เป็นความผิดพลาดในฝั่งของฉัน m-59/nมันควรจะมีการอ่าน เฉพาะช่วงเท่านั้นที่สามารถมีขนาดขั้นตอนได้ (ดูman 5 crontab) ฉันได้อัปเดตคำตอบแล้ว
kvantour

3

2 ขั้นตอนในการตรวจสอบว่า cronjob ทำงานหรือไม่:

  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 นาทีในอาร์กิวเมนต์ที่ 1 จากนั้นจึงกำหนดเส้นทางของสคริปต์ของคุณ

เป็นเวลา 15 นาที

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

1
สิ่งนี้ไม่ได้เรียกใช้ taks ทุก x (15) นาที มันทำงานบน x (1) นาทีหลังจากทุกๆชั่วโมงเต็ม
silverdr
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.