Her X dakikada bir cronjob nasıl çalıştırılır?


96

Bir cronjob içinde bir PHP betiği çalıştırıyorum ve her 5 dakikada bir e-posta göndermek istiyorum

Mevcut (crontab) cronjob:

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

Cronmail.php aşağıdaki gibidir:

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

Ancak 30 dakika içinde bu yapılandırmayla ilgili bir e-posta almadım.


2
mutlak yolunuz muhtemelen doğru değil
Rene Pot

lütfen bana doğru yolu öner php dosyam cromail.php kök dizine - mydomain.in/cromail.php
Savan Paun

Bazen php-cli, tarih kullanmasanız bile php.ini'nizde geçerli saat dilimini ayarlamadığınız için çalışmak istemez.
T00rk

Öyle mi cromail.phpyoksa cronmail.php?
Biffen

cromail.php yalnızca test için
Savan Paun

Yanıtlar:


171

Bir crontabdosyada alanlar şunlardır:

  • saatin dakikası.
  • günün saati.
  • ayın günü.
  • yılın ayı.
  • haftanın günü.

Yani:

10 * * * * blah

blahher saati 10 dakika geçe yürütmek anlamına gelir .

Her beş dakikada bir isterseniz şunlardan birini kullanın:

*/5 * * * * blah

yani her dakika ama sadece her beşte bir veya:

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

gösterimi cronanlamayan eski çalıştırılabilir dosyalar için */x.

Bundan sonra hala çalışmıyor gibi görünüyorsa, komutu aşağıdaki gibi değiştirin:

date >>/tmp/debug_cron_pax.txt

ve her beş dakikada bir bir şeyler yazıldığından emin olmak için bu dosyayı izleyin. Öyleyse, PHP betiklerinizde bir sorun var. Değilse, cronarka plan programınızda bir sorun var .


i güncelleme * / 5 * * * * alanadim.in/cronmail.php> / dev / null 2> & 1 E-posta
almıyorum

Burada bahsedilen komutu da kullandım, ancak ondan sonra bir dönüş ifadem olduğu için çalışmıyordu. İfadeyi return ile ve ayrıca bir notla sonlandırmadığınızdan emin olun, yeni cron oluşturulduğunda "crontab: yeni crontab yükleniyor" mesajını gösterir.
lanet olsun

31

CRON'nuz şöyle görünmelidir:

*/5 * * * *

CronWTF , CRON ayarlarınızı test etmeniz gerektiğinde gerçekten yararlıdır.

Çıktıyı bir günlük dosyasına yönlendirmek iyi bir fikir olabilir, böylece komut dosyanızın herhangi bir hata atıp atmadığını görebilirsiniz - çünkü bunları terminalinizde görmeyeceksiniz.

Sistemin PHP'yi nerede bulacağını bilmesi için PHP dosyanızın üstünde bir shebang kullanmayı da deneyin. Gibi:

#!/usr/bin/php

bu şekilde her şeyi böyle arayabilirsin

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


i güncelleme * / 5 * * * * alanadim.in/cronmail.php> / dev / null 2> & 1 E-posta
almıyorum

2
Komut dosyasını cron aracılığıyla değil, manuel olarak çalıştırmayı denediniz mi? Sorun aslında senaryonun kendisinde olabilir.
Gary Jones

6

Cron'unuzu her saat başı 10. dakikada çalışacak şekilde ayarlıyorsunuz. Değiştirmek üzere
ayarlamak every 5 minsiçin*/5 * * * * /usr/bin/php /mydomain.in/cronmail.php > /dev/null 2>&1


i güncelleme * / 5 * * * * alanadim.in/cronmail.php> / dev / null 2> & 1 E-posta
almıyorum

@ user3705511 php üzerinden çalıştırmayı unuttunuz - eksik usr/bin/phpparça
Justinas

* / 5 * * * * usr / bin / php / alanim.in / cronmail.php> / dev / null 2> & 1 eklendi ancak hala e-posta almıyor
Savan Paun

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

güncellendi ancak hala e-posta almıyor * / 5 * * * * usr / bin / php / alanadim.in/cronmail.php> / dev / null 2> & 1
Savan Paun

5

Her ndakika bir cron çalıştırmak istiyorsanız , değerine bağlı olarak birkaç olası seçenek vardır n.

n 60'ı böler (1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30)

Burada çözüm, /gösterimi kullanarak basittir :

# 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

Yukarıda, ndeğeri temsil eder nve veya mdeğerinden küçük bir değeri temsil eder . Bu, komutu dakikalarda çalıştıracakn*m,m+n,m+2n,...

n 60'ı bölmez

Eğer n60 bölmek değil, siz cron ile bu temiz yapamaz ama mümkün. Bunu yapmak için, testin zamanı kontrol ettiği cron'a bir test koymanız gerekir. Bu, en iyi UNIX zaman damgasına bakıldığında yapılır, o zamandan beri geçen toplam saniye 1970-01-01 00:00:00 UTC. Diyelim ki, Marty McFly Riverdale'e ilk geldiğinde komutu çalıştırmaya başlamak ve ardından her ndakika sonra tekrar etmek istiyoruz .

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

Bir 42cronjob'un "2015-10-21 07:28:00 '' den sonra her dakika çalışması için, crontab şöyle görünür:

# 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

olarak minutetestcmdtanımlanan

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

Not: UNIX zamanı artık saniyeden etkilenmez

Not: cron saniyenin altında doğruluğu yoktur


m/nNotasyonu benim sistemlerde çalışması (Debian 9, Ubuntu 16.04) görünmüyor. Sadece */nçalışır. Örneğin, 5/5veya syslog olarak 4/10verin Error: bad minute; while reading /etc/crontab(Ubuntu'da cron v. 3.0pl1-128ubuntu2 ile). Bu m / n gösterimi terk mi edildi, yoksa sadece bazı sistemlerde mi mevcut?
mivk

@mivk Bunu işaret ettiğiniz için teşekkürler. Bu benim açımdan bir hataydı. Okumalıydı m-59/n. Yalnızca bir aralıkta adım boyutu olabilir. (bkz. man 5 crontab). Cevabı güncelledim
kvantour

3

Bir cronjob çalışıp çalışmadığını kontrol etmek için 2 adım:

  1. Cronjob'u yürüten kullanıcıyla sunucuda oturum açın
  2. El ile php komutunu çalıştırın:

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

Ve herhangi bir hata görüntülenip görüntülenmediğini kontrol edin


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 dakikayı ayarlamak için 1. bağımsız değişkende x dakika ve ardından betiğinizin yolunu ayarlamamız gerekir.

15 dakika için

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

1
Bu, her x (15) dakikada bir TAKSİ ÇALIŞTIRMAZ. Her tam saatten sonra x (1) dakikada çalıştırır.
silverdr
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.