Jak uruchomić cronjob co X minut?

95

Uruchamiam skrypt PHP w cronjob i chcę wysyłać e-maile co 5 minut

Mój obecny (crontab) cronjob:

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

Plik cronmail.php jest następujący:

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

Ale nie otrzymałem e-maila w ciągu 30 minut przy tej konfiguracji.

Savan Paun
źródło
2
twoja absolutna ścieżka prawdopodobnie nie jest poprawna
Rene Pot,
proszę zasugeruj mi właściwą ścieżkę mój plik php cromail.php jest w katalogu głównym - mydomain.in/cromail.php
Savan Paun
Czasami php-cli nie chce działać tylko dlatego, że nie ustawiłeś aktualnej strefy czasowej w swoim php.ini, nawet jeśli nie używasz daty.
T00rk
Czy to jest cromail.phpczy cronmail.php?
Biffen
cromail.php tylko do testowania
Savan Paun

Odpowiedzi:

170

W crontabpliku są to pola:

  • minuta godziny.
  • godzina dnia.
  • dzień miesiąca.
  • miesiąc roku.
  • dzień tygodnia.

Więc:

10 * * * * blah

oznacza wykonywanie blahco 10 minut po każdej godzinie.

Jeśli chcesz co pięć minut, użyj:

*/5 * * * * blah

czyli co minutę, ale tylko co piątą, lub:

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

dla starszych cronplików wykonywalnych, które nie rozumieją */xnotacji.

Jeśli po tym nadal wydaje się nie działać, zmień polecenie na coś takiego:

date >>/tmp/debug_cron_pax.txt

i monitoruj ten plik, aby upewnić się, że coś jest zapisywane co pięć minut. Jeśli tak, coś jest nie tak z Twoimi skryptami PHP. Jeśli nie, coś jest nie tak z twoim crondemonem.

paxdiablo
źródło
aktualizuję * / 5 * * * * mojadomena.in/cronmail.php> / dev / null 2> & 1 Nie otrzymuję wiadomości e
Savan Paun
Użyłem również wspomnianego tutaj polecenia, ale nie działało, ponieważ miałem po nim instrukcję powrotu. Upewnij się, że instrukcja nie kończy się zwrotem return, a także uwagą, że po utworzeniu nowego crona wyświetla się komunikat „crontab: instalacja nowej tabeli crontab”.
damndemon
31

Twój CRON powinien wyglądać tak:

*/5 * * * *

CronWTF jest naprawdę przydatny, gdy chcesz przetestować ustawienia CRON.

Dobrym pomysłem może być przesłanie danych wyjściowych do pliku dziennika, abyś mógł sprawdzić, czy twój skrypt również nie generuje żadnych błędów - ponieważ nie zobaczysz ich w terminalu.

Spróbuj także użyć znaku shebang na początku pliku PHP, aby system wiedział, gdzie znaleźć PHP. Jak na przykład:

#!/usr/bin/php

w ten sposób możesz to nazwać w ten sposób

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

Gary Jones
źródło
aktualizuję * / 5 * * * * mydomain.in/cronmail.php> / dev / null 2> & 1 Nie otrzymuję wiadomości e
Savan Paun
2
Czy próbowałeś uruchomić skrypt ręcznie, a nie przez cron? Problem może dotyczyć samego skryptu.
Gary Jones
6

Ustawiasz crona tak, aby działał co 10 minuty co godzinę.
Aby ustawić every 5 minszmianę na*/5 * * * * /usr/bin/php /mydomain.in/cronmail.php > /dev/null 2>&1

Justinas
źródło
aktualizuję * / 5 * * * * mojadomena.in/cronmail.php> / dev / null 2> & 1 Nie otrzymuję wiadomości e
Savan Paun
@ user3705511 Zapomniałeś uruchomić go przez php - brakująca usr/bin/phpczęść
Justinas
dodano * / 5 * * * * usr / bin / php / mydomain.in / cronmail.php> / dev / null 2> & 1, ale nadal nie otrzymuję wiadomości e
Savan Paun
@ user3705511*/5 * * * * /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1
Justinas
zaktualizowany, ale nadal nie otrzymuję wiadomości e-mail * / 5 * * * * usr / bin / php / mydomain.in/cronmail.php> / dev / null 2> & 1
Savan Paun
5

Jeśli chcesz uruchamiać crona co nminuty, istnieje kilka możliwych opcji w zależności od wartości n.

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

Tutaj rozwiązanie jest proste dzięki zastosowaniu /notacji:

# 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

W powyższym noznacza wartość ni mprzedstawia wartość mniejszą niż nlub *. Spowoduje to wykonanie polecenia w minutachm,m+n,m+2n,...

n NIE dzieli 60

Jeśli nnie dzieli 60, nie można tego zrobić czysto za pomocą crona, ale jest to możliwe. Aby to zrobić, musisz umieścić test w cronie, w którym test sprawdza czas. Najlepiej jest to zrobić patrząc na znacznik czasu UNIX, czyli całkowitą liczbę sekund, które upłynęły od tego czasu 1970-01-01 00:00:00 UTC. Powiedzmy, że chcemy rozpocząć uruchamianie polecenia za pierwszym razem, gdy Marty McFly przybył do Riverdale, a następnie powtarzać je co nminuty później.

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

Aby cronjob działał co 42nd minutę po `2015-10-21 07:28:00 ', plik crontab wyglądałby następująco:

# 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

ze minutetestcmdzdefiniowanym jako

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

Uwaga: na czas UNIX nie mają wpływu sekundy przestępne

Uwaga: cron nie ma dokładności poniżej sekundy

kvantour
źródło
m/nNotacja nie wydaje się działać na moim systemów (Debian 9, Ubuntu 16.04). Tylko */ndziała. Na przykład 5/5lub 4/10daj Error: bad minute; while reading /etc/crontabw syslog (w Ubuntu z cron v. 3.0pl1-128ubuntu2). Czy ten zapis m / n został porzucony, czy jest dostępny tylko w niektórych systemach?
mivk
@mivk Dzięki za wskazanie tego. To był błąd z mojej strony. Powinien był przeczytać m-59/n. Tylko zakres może mieć wielkość kroku. (patrz man 5 crontab). Zaktualizowałem odpowiedź
kvantour
3

2 kroki, aby sprawdzić, czy cronjob działa:

  1. Zaloguj się na serwerze z użytkownikiem, który wykonuje cronjob
  2. Ręcznie uruchom polecenie php:

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

I sprawdź, czy jest wyświetlany jakiś błąd

Paul Giragossian
źródło
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

Aby ustawić x minut, musimy ustawić x minut w pierwszym argumencie, a następnie ścieżkę twojego skryptu

Przez 15 minut

*/15 * * * *  /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1
Javeed Shakeel
źródło
1
To NIE uruchamia zadania CO x (15) minut. Uruchamia go x (1) minut po każdej pełnej godzinie.
silverdr