Làm thế nào để chạy một cronjob mỗi X phút?


94

Tôi đang chạy một tập lệnh PHP trong cronjob và tôi muốn gửi email 5 phút một lần

Công việc hiện tại (crontab) của tôi:

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

Cronmail.php như sau:

<?php
$from = 'D'; // sender
$subject = 'S';
$message = 'M';
$message = wordwrap($message, 70);
mail("myemail@gmail.com", $subject, $message, "From: $from\n");
?>

Nhưng tôi đã không nhận được email sau 30 phút với cấu hình này.


2
đường dẫn tuyệt đối của bạn có thể không chính xác
Rene Pot

xin gợi ý cho tôi đi đúng hướng cromail.php tập tin php của tôi là vào thư mục gốc - mydomain.in/cromail.php
Savan Păun

Đôi khi php-cli không muốn hoạt động chỉ vì bạn chưa đặt múi giờ hiện tại trong php.ini ngay cả khi bạn không sử dụng ngày.
T00rk

Là nó cromail.phphay cronmail.php?
Biffen

cromail.php chỉ để thử nghiệm
Savan Paun

Câu trả lời:


165

Trong một crontabtệp, các trường là:

  • phút của giờ.
  • giờ trong ngày.
  • Ngày trong tháng.
  • thang của năm.
  • ngày trong tuần.

Vì thế:

10 * * * * blah

có nghĩa là thực thi blahlúc 10 phút trước mỗi giờ.

Nếu bạn muốn cứ năm phút một lần, hãy sử dụng:

*/5 * * * * blah

nghĩa là mỗi phút nhưng chỉ mỗi phút một phần năm, hoặc:

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

cho các crontệp thực thi cũ hơn không hiểu */xký hiệu.

Nếu nó vẫn không hoạt động sau đó, hãy thay đổi lệnh thành một cái gì đó như:

date >>/tmp/debug_cron_pax.txt

và giám sát tệp đó để đảm bảo nội dung nào đó được ghi sau mỗi năm phút. Nếu vậy, có gì đó sai với các tập lệnh PHP của bạn. Nếu không, có điều gì đó không ổn với crondaemon của bạn .


tôi cập nhật * / 5 * * * * mydomain.in/cronmail.php> / dev / null 2> & 1 Không nhận được email
Savan Paun

Tôi cũng đã sử dụng lệnh được đề cập ở đây, nhưng nó không hoạt động vì tôi có một câu lệnh trả về sau nó. Đảm bảo không kết thúc câu lệnh bằng return và cũng như ghi chú, khi cron mới được tạo, nó sẽ hiển thị thông báo "crontab: install new crontab".
damndemon

31

CRON của bạn sẽ trông như thế này:

*/5 * * * *

CronWTF thực sự hữu ích khi bạn cần kiểm tra cài đặt CRON của mình.

Có thể là một ý tưởng hay khi chuyển kết quả đầu ra vào một tệp nhật ký để bạn có thể xem liệu tập lệnh của mình có gặp lỗi nào không - vì bạn sẽ không nhìn thấy chúng trong thiết bị đầu cuối của mình.

Ngoài ra, hãy thử sử dụng shebang ở đầu tệp PHP của bạn, để hệ thống biết tìm PHP ở đâu. Nhu la:

#!/usr/bin/php

theo cách đó bạn có thể gọi toàn bộ mọi thứ như thế này

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


tôi cập nhật * / 5 * * * * mydomain.in/cronmail.php> / dev / null 2> & 1 Không nhận được email
Savan Paun

2
Bạn đã thử chạy script theo cách thủ công và không thông qua cron chưa? Vấn đề thực sự có thể là với chính script.
Gary Jones

5

Bạn đang đặt cron của mình chạy vào phút thứ 10 sau mỗi giờ.
Để đặt nó every 5 minsthay đổi thành*/5 * * * * /usr/bin/php /mydomain.in/cronmail.php > /dev/null 2>&1


tôi cập nhật * / 5 * * * * mydomain.in/cronmail.php> / dev / null 2> & 1 Không nhận được email
Savan Paun

@ user3705511 Bạn quên để chạy nó thông qua php - thiếu usr/bin/phpphần
Justinas

đã thêm * / 5 * * * * usr / bin / php / mydomain.in / cronmail.php> / dev / null 2> & 1 nhưng vẫn không nhận được email
Savan Paun

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

đã cập nhật nhưng vẫn không nhận được email * / 5 * * * * * usr / bin / php / mydomain.in/cronmail.php> / dev / null 2> & 1
Savan Paun

5

Nếu bạn muốn chạy cron mỗi nphút, có một vài tùy chọn khả thi tùy thuộc vào giá trị của n.

n chia 60 (1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30)

Ở đây, giải pháp rất đơn giản bằng cách sử dụng /ký hiệu:

# 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

Ở trên, nđại diện cho giá trị nmđại diện cho một giá trị nhỏ hơn nhoặc *. Điều này sẽ thực hiện lệnh vào phútm,m+n,m+2n,...

n KHÔNG chia 60

Nếu nkhông chia 60, bạn không thể làm điều này một cách sạch sẽ với cron nhưng nó có thể. Để làm điều này, bạn cần đặt một bài kiểm tra trong cron nơi bài kiểm tra kiểm tra thời gian. Điều này được thực hiện tốt nhất khi nhìn vào dấu thời gian UNIX, tổng số giây kể từ đó 1970-01-01 00:00:00 UTC. Giả sử chúng ta muốn bắt đầu chạy lệnh lần đầu tiên khi Marty McFly đến Riverdale và sau đó lặp lại lệnh này mỗi nphút sau đó.

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

Đối với một cronjob chạy mỗi 42phút thứ hai sau `` 2015-10-21 07:28:00 '', crontab sẽ trông như thế này:

# 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

với minutetestcmdđịnh nghĩa là

#!/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 ))

Ghi chú: Thời gian UNIX không bị ảnh hưởng bởi giây nhuận

Ghi chú: cron không có độ chính xác dưới giây


Các m/nký hiệu dường như không làm việc trên hệ thống của tôi (Debian 9, Ubuntu 16,04). Chỉ */nhoạt động. Ví dụ, 5/5hoặc 4/10đưa Error: bad minute; while reading /etc/crontabvào nhật ký hệ thống (trong Ubuntu với cron v. 3.0pl1-128ubuntu2). Ký hiệu m / n này đã bị loại bỏ hay nó chỉ khả dụng trong một số hệ thống?
mivk

@mivk Cảm ơn bạn đã chỉ ra điều này. Đây là một sai lầm từ phía tôi. Nó nên đọc m-59/n. Chỉ một phạm vi mới có thể có kích thước bước. (xem man 5 crontab). Tôi đã cập nhật câu trả lời
kvantour

3

2 bước để kiểm tra xem cronjob có hoạt động không:

  1. Đăng nhập trên máy chủ với người dùng thực thi cronjob
  2. Chạy lệnh php theo cách thủ công:

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

Và kiểm tra xem có lỗi nào hiển thị không


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

Để đặt x phút, chúng ta cần đặt x phút trong đối số thứ nhất và sau đó là đường dẫn của tập lệnh của bạn

Trong 15 phút

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

1
Điều này KHÔNG chạy các thẻ MỖI x (15) phút. Nó chạy trong x (1) phút sau mỗi giờ đầy đủ.
silverdr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.