X 분마다 cronjob을 실행하는 방법은 무엇입니까?


95

cronjob에서 PHP 스크립트를 실행하고 있으며 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("myemail@gmail.com", $subject, $message, "From: $from\n");
?>

하지만이 구성으로 30 분 동안 이메일을받지 못했습니다.


2
당신의 절대 경로는 아마 정확하지 않습니다
르네 냄비

mydomain.in/cromail.php - 내 PHP 파일 cromail.php 루트 디렉토리에있다 나에게 옳은 길을 제시하십시오
Savan Paun

날짜를 사용하지 않더라도 php.ini에서 현재 시간대를 설정하지 않았기 때문에 php-cli가 작동하지 않는 경우가 있습니다.
T00rk 2014 년

그것은인가 cromail.php또는 cronmail.php?
Biffen 2014 년

테스트 전용
cromail.php

답변:


170

A의 crontab파일의 필드는 다음과 같습니다

  • 분.
  • 시간.
  • 월의 일.
  • 올해의 달.
  • 요일.

그래서:

10 * * * * blah

blah매시간 10 분에 실행한다는 의미 입니다.

5 분마다 원하는 경우 다음 중 하나를 사용하십시오.

*/5 * * * * blah

1 분마다 5 분마다 만 의미합니다.

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

표기법을 cron이해하지 못하는 이전 실행 파일의 경우 */x.

후에도 여전히 작동하지 않는 것 같으면 명령을 다음과 같이 변경하십시오.

date >>/tmp/debug_cron_pax.txt

파일이 5 분마다 기록되는지 확인합니다. 그렇다면 PHP 스크립트에 문제가있는 것입니다. 그렇지 않다면 cron데몬에 문제가 있습니다 .


i update * / 5 * * * * mydomain.in/cronmail.php> / dev / null 2> & 1 Not
received

여기에 언급 된 명령도 사용했지만 그 뒤에 return 문이있어서 작동하지 않았습니다. 새 cron이 작성되면 "crontab : 새 crontab 설치"메시지가 표시됩니다.
damndemon

31

CRON은 다음과 같아야합니다.

*/5 * * * *

CronWTF 는 CRON 설정을 테스트해야 할 때 정말 유용합니다.

출력을 로그 파일로 파이프하여 스크립트에서 오류가 발생하는지 확인할 수 있습니다. 터미널에서 오류를 볼 수 없기 때문입니다.

또한 PHP 파일 맨 위에있는 shebang을 사용하여 시스템이 PHP를 찾을 수있는 위치를 파악합니다. 예 :

#!/usr/bin/php

그렇게하면이 모든 것을 이렇게 부를 수 있습니다.

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


i update * / 5 * * * * mydomain.in/cronmail.php> / dev / null 2> & 1 Not
received

2
크론을 통하지 않고 수동으로 스크립트를 실행 해 보셨습니까? 문제는 실제로 스크립트 자체에있을 수 있습니다.
Gary Jones

6

매시간 10 분에 실행되도록 크론을 설정하고 있습니다. 변경하도록
설정하려면every 5 mins*/5 * * * * /usr/bin/php /mydomain.in/cronmail.php > /dev/null 2>&1


i update * / 5 * * * * mydomain.in/cronmail.php> / dev / null 2> & 1 Not
received

@ user3705511 당신은 PHP를 통해 그것을 실행하는 것을 잊었다 -없는 usr/bin/php부분
Justinas

추가 * / 5 * * * * USR / 빈 / 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 / 빈 / PHP / mydomain.in/cronmail.php>을 / dev / null 2> & 1
Savan Paun

5

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는 값 nm나타내며 n또는 보다 작은 값 을 나타냅니다 *. 이것은 분에 명령을 실행합니다m,m+n,m+2n,...

n 60을 나누지 않음

경우 n(60)를 분할하지 않습니다, 당신은 크론이 깨끗하게 할 수 없지만이 가능합니다. 이렇게하려면 테스트가 시간을 확인하는 크론에 테스트를 넣어야합니다. 이는 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 '이후 1 분 마다 실행되는 경우 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 초 미만의 정확도가 없습니다 .


m/n표기법은 내 시스템에서 작업 (데비안 9, 우분투 16.04)하지 않는 것. 만 */n작동합니다. 예를 들어 5/54/10주고 Error: bad minute; while reading /etc/crontab시스템 로그에 (크론 V 우분투 인치 3.0pl1-128ubuntu2). 이 m / n 표기법을 포기 했습니까? 아니면 일부 시스템에서만 사용할 수 있습니까?
mivk 19

@mivk 이것을 지적 해 주셔서 감사합니다. 이것은 내 실수였습니다. 읽어야 m-59/n합니다. 범위 만 단계 크기를 가질 수 있습니다. (참조 man 5 crontab). 나는 답변을 업데이트했습니다
kvantour 19

3

cronjob이 작동하는지 확인하는 2 단계 :

  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 분을 설정 한 다음 스크립트 경로를 설정해야합니다.

15 분

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

1
이것은 매 x (15) 분마다 taks를 실행하지 않습니다. 1 시간마다 x (1) 분에 실행됩니다.
silverdr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.