Come eseguire un cronjob ogni X minuti?


94

Sto eseguendo uno script PHP in un cronjob e desidero inviare e-mail ogni 5 minuti

Il mio cronjob attuale (crontab):

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

Il cronmail.php è il seguente:

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

Ma non ho ricevuto un'email da 30 minuti con questa configurazione.


2
il tuo percorso assoluto probabilmente non è corretto
Rene Pot

per favore suggeriscimi il percorso corretto il mio file php cromail.php è nella directory principale - miodominio.in/cromail.php
Savan Paun

A volte php-cli non vuole funzionare solo perché non hai impostato il fuso orario corrente in php.ini anche se non usi la data.
T00rk

È cromail.phpo cronmail.php?
Biffen

cromail.php solo per test
Savan Paun

Risposte:


165

In un crontabfile, i campi sono:

  • minuto dell'ora.
  • ora del giorno.
  • giorno del mese.
  • mese dell'anno.
  • giorno della settimana.

Così:

10 * * * * blah

significa eseguire blahogni 10 minuti dopo ogni ora.

Se vuoi ogni cinque minuti, usa uno dei seguenti:

*/5 * * * * blah

significa ogni minuto ma solo ogni quinto, oppure:

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

per croneseguibili meno recenti che non comprendono la */xnotazione.

Se dopo ciò sembra ancora non funzionare, modifica il comando in qualcosa di simile:

date >>/tmp/debug_cron_pax.txt

e controlla quel file per assicurarti che venga scritto qualcosa ogni cinque minuti. Se è così, c'è qualcosa che non va nei tuoi script PHP. In caso contrario, c'è qualcosa che non va nel tuo crondaemon.


aggiorno * / 5 * * * * miodominio.in/cronmail.php> / dev / null 2> & 1 Non
ricevo

Ho usato anche il comando menzionato qui, ma non funzionava perché avevo una dichiarazione di ritorno dopo di esso. Assicurati di non terminare l'istruzione con return e anche una nota, quando viene creato un nuovo cron mostra il messaggio "crontab: installazione di nuovo crontab".
damndemon

31

Il tuo CRON dovrebbe assomigliare a questo:

*/5 * * * *

CronWTF è davvero utile quando devi testare le tue impostazioni CRON.

Potrebbe essere una buona idea reindirizzare l'output in un file di registro in modo da poter vedere se anche lo script genera errori, poiché non li vedrai nel tuo terminale.

Prova anche a usare uno shebang all'inizio del tuo file PHP, così il sistema sa dove trovare PHP. Ad esempio:

#!/usr/bin/php

in questo modo puoi chiamare l'intera cosa in questo modo

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


aggiorno * / 5 * * * * miodominio.in/cronmail.php> / dev / null 2> & 1 Non
ricevo

2
Hai provato a eseguire lo script manualmente e non tramite cron? Il problema potrebbe essere effettivamente con lo script stesso.
Gary Jones

5

Stai impostando il tuo cron in modo che venga eseguito al decimo minuto ogni ora.
Per impostarlo per every 5 minspassare a*/5 * * * * /usr/bin/php /mydomain.in/cronmail.php > /dev/null 2>&1


aggiorno * / 5 * * * * miodominio.in/cronmail.php> / dev / null 2> & 1 Non
ricevo

@ user3705511 Ti sei dimenticato di eseguirlo tramite php - usr/bin/phpparte mancante
Justinas

aggiunto * / 5 * * * * usr / bin / php / miodominio.in / cronmail.php> / dev / null 2> & 1 ma non riceve ancora email
Savan Paun

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

aggiornato ma non ricevo ancora email * / 5 * * * * usr / bin / php / miodominio.in/cronmail.php> / dev / null 2> & 1
Savan Paun

5

Se vuoi eseguire un cron ogni nminuto, ci sono alcune possibili opzioni a seconda del valore di n.

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

Qui, la soluzione è semplice utilizzando la /notazione:

# 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

In quanto sopra, nrappresenta il valore ne mrappresenta un valore minore di no *. Questo eseguirà il comando nei minutim,m+n,m+2n,...

n NON divide 60

Se nnon divide 60, non puoi farlo in modo pulito con cron ma è possibile. Per fare questo è necessario mettere un test nel cron dove il test controlla l'ora. È meglio farlo guardando il timestamp UNIX, i secondi totali da allora 1970-01-01 00:00:00 UTC. Diciamo che vogliamo iniziare a eseguire il comando la prima volta quando Marty McFly è arrivato a Riverdale e poi ripeterlo ogni nminuto dopo.

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

Affinché un 42cronjob venga eseguito ogni minuto dopo "2015-10-21 07:28:00", il crontab dovrebbe apparire così:

# 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

con minutetestcmddefinito come

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

Nota: l' ora UNIX non è influenzata dai secondi intercalari

Nota: cron non ha una precisione inferiore al secondo


La m/nnotazione non sembra funzionare sui miei sistemi (Debian 9, Ubuntu 16.04). */nFunziona solo . Ad esempio, 5/5o 4/10dare Error: bad minute; while reading /etc/crontabin syslog (in Ubuntu con cron v. 3.0pl1-128ubuntu2). Questa notazione m / n è stata abbandonata o è disponibile solo in alcuni sistemi?
mivk

@mivk Grazie per averlo sottolineato. Questo è stato un errore da parte mia. Avrebbe dovuto leggere m-59/n. Solo un intervallo può avere una dimensione del passo. (vedi man 5 crontab). Ho aggiornato la risposta
kvantour

3

2 passaggi per verificare se un cronjob funziona:

  1. Accedi al server con l'utente che esegue il cronjob
  2. Esegui manualmente il comando php:

    / usr / bin / php /miodominio.in/cromail.php

E controlla se viene visualizzato qualche errore


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

Per impostare x minuti dobbiamo impostare x minuti nel 1 ° argomento e quindi il percorso del tuo script

Per 15 minuti

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

1
Questo NON esegue i tempi OGNI x (15) minuti. Lo esegue x (1) minuti dopo ogni ora intera.
silverdr
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.