Wie führe ich alle X Minuten einen Cronjob aus?

92

Ich führe ein PHP-Skript in einem Cronjob aus und möchte alle 5 Minuten E-Mails senden

Mein aktueller (crontab) Cronjob:

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

Die cronmail.php lautet wie folgt:

<?php
$from = 'D'; // sender
$subject = 'S';
$message = 'M';
$message = wordwrap($message, 70);
mail("[email protected]", $subject, $message, "From: $from\n");
?>

Aber ich habe seit 30 Minuten keine E-Mail mit dieser Konfiguration erhalten.

Savan Paun
quelle
2
Ihr absoluter Weg ist wahrscheinlich nicht korrekt
Rene Pot
Bitte schlagen Sie mir den richtigen Pfad vor. Meine PHP-Datei cromail.php befindet sich im Stammverzeichnis - mydomain.in/cromail.php
Savan Paun
Manchmal möchte php-cli nicht funktionieren, nur weil Sie die aktuelle Zeitzone in Ihrer php.ini nicht festgelegt haben, auch wenn Sie kein Datum verwenden.
T00rk
Ist es cromail.phpoder cronmail.php?
Biffen
cromail.php nur zum Testen
Savan Paun

Antworten:

163

In einer crontabDatei lauten die Felder:

  • Minute der Stunde.
  • Stunde des Tages.
  • Tag des Monats.
  • Monat des Jahres.
  • Wochentag.

So:

10 * * * * blah

bedeutet ausführen blah um 10 Minuten nach jeder Stunde .

Wenn Sie alle fünf Minuten möchten, verwenden Sie entweder:

*/5 * * * * blah

bedeutet jede Minute, aber nur jede fünfte, oder:

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

für ältere cronausführbare Dateien, die die */xNotation nicht verstehen .

Wenn es danach immer noch nicht funktioniert, ändern Sie den Befehl in:

date >>/tmp/debug_cron_pax.txt

und überwachen Sie diese Datei, um sicherzustellen, dass alle fünf Minuten etwas geschrieben wird. Wenn ja, stimmt etwas mit Ihren PHP-Skripten nicht. Wenn nicht, stimmt etwas mit Ihrem cronDaemon nicht.

paxdiablo
quelle
Ich aktualisiere * / 5 * * * * mydomain.in/cronmail.php> / dev / null 2> & 1 Keine E-Mail erhalten
Savan Paun
Ich habe auch den hier erwähnten Befehl verwendet, aber er hat nicht funktioniert, weil ich danach eine return-Anweisung hatte. Stellen Sie sicher, dass Sie die Anweisung nicht mit return und einem Hinweis beenden. Wenn ein neues Cron erstellt wird, wird die Meldung "crontab: Installation eines neuen crontab" angezeigt.
Damndemon
31

Ihr CRON sollte folgendermaßen aussehen:

*/5 * * * *

CronWTF ist sehr nützlich, wenn Sie Ihre CRON-Einstellungen testen müssen.

Es könnte eine gute Idee sein, die Ausgabe in eine Protokolldatei zu leiten, damit Sie sehen können, ob Ihr Skript auch Fehler auslöst - da Sie diese in Ihrem Terminal nicht sehen.

Versuchen Sie auch, einen Shebang oben in Ihrer PHP-Datei zu verwenden, damit das System weiß, wo sich PHP befindet. Sowie:

#!/usr/bin/php

Auf diese Weise können Sie das Ganze so nennen

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

Gary Jones
quelle
Ich aktualisiere * / 5 * * * * mydomain.in/cronmail.php> / dev / null 2> & 1 Keine E-Mail erhalten
Savan Paun
2
Haben Sie versucht, das Skript manuell und nicht über das Cron auszuführen? Das Problem kann tatsächlich am Skript selbst liegen.
Gary Jones
5

Sie stellen Ihren Cron so ein, dass er jede Stunde in der 10. Minute läuft.
Zum Einstellen auf every 5 minsändern*/5 * * * * /usr/bin/php /mydomain.in/cronmail.php > /dev/null 2>&1

Justinas
quelle
Ich aktualisiere * / 5 * * * * mydomain.in/cronmail.php> / dev / null 2> & 1 Keine E-Mail erhalten
Savan Paun
@ user3705511 Sie haben vergessen, es über PHP auszuführen - fehlender usr/bin/phpTeil
Justinas
hinzugefügt * / 5 * * * * usr / bin / php / mydomain.in / cronmail.php> / dev / null 2> & 1, aber immer noch keine E-Mail erhalten
Savan Paun
@ user3705511*/5 * * * * /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1
Justinas
aktualisiert, aber immer noch keine E-Mail erhalten * / 5 * * * * usr / bin / php / mydomain.in/cronmail.php> / dev / null 2> & 1
Savan Paun
5

Wenn Sie alle nMinuten einen Cron ausführen möchten , gibt es je nach Wert von einige mögliche Optionen n.

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

Hier ist die Lösung einfach, indem die /Notation verwendet wird:

# 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

Stellt oben nden Wert dar nund mstellt einen Wert dar, der kleiner als noder ist *. Dadurch wird der Befehl minutengenau ausgeführtm,m+n,m+2n,...

n teilt NICHT 60

Wenn n60 nicht geteilt wird, können Sie dies mit cron nicht sauber machen, aber es ist möglich. Dazu müssen Sie einen Test in das Cron einfügen, in dem der Test die Zeit überprüft. Dies geschieht am besten, wenn Sie sich den UNIX-Zeitstempel ansehen, die Gesamtzahl der Sekunden seitdem 1970-01-01 00:00:00 UTC. Nehmen wir an, wir möchten den Befehl zum ersten Mal ausführen, wenn Marty McFly in Riverdale ankommt, und ihn dann alle nMinuten später wiederholen .

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

Damit ein Cronjob jede 42Minute nach "2015-10-21 07:28:00" ausgeführt wird, sieht der Crontab folgendermaßen aus:

# 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

mit minutetestcmddefiniert als

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

Anmerkung: Die UNIX-Zeit wird nicht durch Schaltsekunden beeinflusst

Bemerkung: cron hat keine Genauigkeit von weniger als einer Sekunde

kvantour
quelle
Die m/nNotation scheint auf meinen Systemen nicht zu funktionieren (Debian 9, Ubuntu 16.04). Funktioniert nur */n. Zum Beispiel 5/5oder 4/10geben Sie Error: bad minute; while reading /etc/crontabin syslog (in Ubuntu mit cron v. 3.0pl1-128ubuntu2). Wurde diese M / N-Notation aufgegeben oder ist sie nur in einigen Systemen verfügbar?
Mivk
@mivk Danke, dass du darauf hingewiesen hast. Das war ein Fehler auf meiner Seite. Es hätte lesen sollen m-59/n. Nur ein Bereich kann eine Schrittgröße haben. (siehe man 5 crontab). Ich habe die Antwort aktualisiert
kvantour
3

2 Schritte, um zu überprüfen, ob ein Cronjob funktioniert:

  1. Melden Sie sich auf dem Server mit dem Benutzer an, der den Cronjob ausführt
  2. Führen Sie den Befehl php manuell aus:

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

Und prüfen Sie, ob ein Fehler angezeigt wird

Paul Giragossian
quelle
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

Um x Minuten festzulegen, müssen Sie im ersten Argument x Minuten und dann den Pfad Ihres Skripts festlegen

Für 15 Minuten

*/15 * * * *  /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1
Javeed Shakeel
quelle
1
Dies dauert NICHT ALLE x (15) Minuten. Es läuft x (1) Minuten nach jeder vollen Stunde.
Silverdr