it-swarm.com.de

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

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

Mein jetziger (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");
?>

Ich habe jedoch in 30 Minuten keine E-Mail mit dieser Konfiguration erhalten.

51
Savan Paun

In einer crontab-Datei lauten die Felder:

  • minute der Stunde.
  • stunde des Tages.
  • tag des Monats.
  • monat des Jahres.
  • wochentag.

So:

10 * * * * blah

bedeutet, dass Sie blah jede Stunde nach 10 Minuten ausführen.

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 cron-ausführbare Dateien, die die */x-Notation nicht verstehen.

Wenn still danach nicht mehr zu funktionieren scheint, ändern Sie den Befehl in etwas wie:

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. Andernfalls ist mit Ihrem cron-Dämon etwas nicht in Ordnung.

94
paxdiablo

Dein CRON sollte so aussehen:

*/5 * * * *

CronWTF ist wirklich nützlich, wenn Sie Ihre CRON-Einstellungen testen möchten.

Es könnte eine gute Idee sein, die Ausgabe in eine Protokolldatei zu leiten, damit Sie sehen können, ob Ihr Skript auch Fehler ausgibt, da Sie sie nicht in Ihrem Terminal 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

22
Gary Jones

Sie stellen Ihren Cron so ein, dass er in jeder Stunde zur 10. Minute läuft.
Um es auf every 5 mins zu setzen, ändere auf */5 * * * * /usr/bin/php /mydomain.in/cronmail.php > /dev/null 2>&1

3
Justinas

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. PHP-Befehl manuell ausführen: 

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

Überprüfen Sie, ob ein Fehler angezeigt wird

2
# .---------------- 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 1. 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
1
Javeed Shakeel

Wenn Sie alle n Minuten einen Cron ausführen möchten, gibt es abhängig vom Wert von n einige Optionen.

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

Hier ist die Lösung durch Verwendung der /-Notation unkompliziert:

# 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/n  *  *  *  *   command

In der obigen Beschreibung repräsentiert n den Wert n und m einen Wert, der kleiner als n oder * ist. Der Befehl wird zu den Minuten ausgeführt. m,m+n,m+2n,...

n teilt NICHT 60

Wenn n 60 nicht teilt, können Sie dies mit cron nicht sauber tun, aber es ist möglich. Dazu müssen Sie einen Test im cron durchführen, wo der Test die Zeit prüft. Dies geschieht am besten, wenn Sie sich den UNIX-Zeitstempel ansehen, die Gesamtzeit seit 1970-01-01 00:00:00 UTC. Nehmen wir an, wir wollen den Befehl ausführen, wenn Marty McFly zum ersten Mal in Riverdale ankam, und ihn dann alle n Minuten später wiederholen.

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

Damit ein Cronjob jede 42nd Minute nach '2015-10-21 07:28:00' laufen kann, würde die Crontab so aussehen:

# 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 minutetestcmd definiert 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 von Schaltsekunden beeinflusst

Anmerkung: cron hat keine Genauigkeit unter einer Sekunde

0
kvantour