Hoe voer je elke X minuten een cronjob uit?

Ik gebruik een PHP-script in een cronjob en ik wil elke 5 minuten e-mails verzenden

Mijn huidige (crontab) cronjob:

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

De cronmail.php is als volgt:

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

Maar ik heb al 30 minuten geen e-mail ontvangen met deze configuratie.


Antwoord 1, autoriteit 100%

In een crontab-bestand zijn de velden:

  • minuut van het uur.
  • uur van de dag.
  • dag van de maand.
  • maand van het jaar.
  • dag van de week.

Dus:

10 * * * * blah

betekent dat u blahom 10 minuten over elk uur uitvoert.

Als je elke vijf minuten wilt, gebruik dan:

*/5 * * * * blah

wat betekent dat elke minuut, maar slechts elke vijfde, of:

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

voor oudere cronuitvoerbare bestanden die de notatie */xniet begrijpen.

Als het nogdaarna niet lijkt te werken, verander dan het commando in iets als:

date >>/tmp/debug_cron_pax.txt

Monitor dat bestand om ervoor te zorgen dat er iets wordt geschreven om de vijf minuten. Als dat zo is, is er iets mis met uw PHP-scripts. Zo niet, dan is er iets mis met uw cronDAEMON.


Antwoord 2, Autoriteit 18%

Uw CRON moet er als volgt uitzien:

*/5 * * * *

Cronwtf is echt nuttig wanneer u uw cron-instellingen wilt testen.

is misschien een goed idee om de uitvoer in een logbestand te pijpen, zodat u kunt zien of uw script ook fouten gooit – omdat u ze niet in uw terminal ziet.

Probeer ook een Shebang bovenaan uw PHP-bestand te gebruiken, zodat het systeem weet waar u PHP kunt vinden. Zoals:

#!/usr/bin/php

Op die manier kunt u het hele ding zo noemen

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


Antwoord 3, Autoriteit 3%

U instelt uw CRON om in elk uur op 10e minuut te lopen.
Om het in te stellen op every 5 minsWijzigen in */5 * * * * /usr/bin/php /mydomain.in/cronmail.php > /dev/null 2>&1


Antwoord 4, Autoriteit 3%

Als u een CRON elke nminuten wilt uitvoeren, zijn er een paar mogelijke opties, afhankelijk van de waarde van n.

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

Hier is de oplossing eenvoudig door gebruik te maken van de /notatie:

# 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 het bovenstaande staat nvoor de waarde nen mvoor een waarde kleiner dan nof *. Dit zal het commando uitvoeren op de minuten m,m+n,m+2n,...

ndeelt GEEN 60

Als n60 niet deelt, kun je dit niet netjes doen met cron, maar het is mogelijk. Om dit te doen, moet je een test in de cron plaatsen waar de test de tijd controleert. Dit kunt u het beste doen als u naar de UNIX-tijdstempel kijkt, het totale aantal seconden sinds 1970-01-01 00:00:00 UTC. Laten we zeggen dat we het commando de eerste keer willen uitvoeren wanneer Marty McFly in Riverdale aankwam en het vervolgens elke nminuten later herhalen.

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

Als een cronjob elke 42de minuut na `2015-10-21 07:28:00′ moet worden uitgevoerd, ziet de crontab er als volgt uit:

# 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

met minutetestcmdgedefinieerd 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 ))

Opmerking:UNIX-tijd wordt niet beïnvloed door schrikkelseconden

Opmerking:cronheeft geen nauwkeurigheid van minder dan een seconde


Antwoord 5, autoriteit 2%

2 stappen om te controleren of een cronjob werkt:

  1. Log in op de server met de gebruiker die de cronjob uitvoert
  2. Handmatig php-commando uitvoeren:

    /usr/bin/php /mijndomein.in/cromail.php

En controleer of er een fout wordt weergegeven


Antwoord 6, autoriteit 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

Om x minuten in te stellen, moeten we x minuten instellen in het eerste argument en vervolgens het pad van je script

Gedurende 15 minuten

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

Other episodes