Como executar um cronjob a cada X minutos?

92

Estou executando um script PHP em um cronjob e quero enviar e-mails a cada 5 minutos

Meu cronjob atual (crontab):

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

O cronmail.php é o seguinte:

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

Mas não recebo um e-mail há 30 minutos com esta configuração.

Savan Paun
fonte
2
seu caminho absoluto provavelmente não está correto
Rene Pot,
por favor, sugira-me o caminho certo em que meu arquivo php cromail.php está no diretório raiz - mydomain.in/cromail.php
Savan Paun
Às vezes, o php-cli não quer funcionar só porque você não configurou o fuso horário atual em seu php.ini, mesmo se você não usar data.
T00rk
É cromail.phpou cronmail.php?
Biffen,
cromail.php apenas para teste
Savan Paun,

Respostas:

163

Em um crontabarquivo, os campos são:

  • minuto da hora.
  • hora do dia.
  • dia do mês.
  • mês do ano.
  • dia da semana.

Assim:

10 * * * * blah

significa executar blah 10 minutos após cada hora.

Se você quiser a cada cinco minutos, use:

*/5 * * * * blah

significando a cada minuto, mas apenas a cada cinco, ou:

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

para os mais velhos cron executáveis que não entendem a */xnotação.

Se ainda parecer não estar funcionando depois disso, altere o comando para algo como:

date >>/tmp/debug_cron_pax.txt

e monitorar esse arquivo para garantir que algo está sendo escrito a cada cinco minutos. Nesse caso, há algo errado com seus scripts PHP. Se não, há algo errado com seu crondaemon.

paxdiablo
fonte
eu atualizo * / 5 * * * * mydomain.in/cronmail.php> / dev / null 2> & 1 Não estou recebendo e
Savan Paun
Usei o comando mencionado aqui também, mas não estava funcionando porque havia uma instrução de retorno depois dele. Certifique-se de não terminar a instrução com return e também uma nota, quando um novo cron é criado ele mostra a mensagem "crontab: installation new crontab".
damndemon
31

Seu CRON deve ter a seguinte aparência:

*/5 * * * *

O CronWTF é realmente útil quando você precisa testar as configurações do CRON.

Pode ser uma boa ideia canalizar a saída para um arquivo de log para que você possa ver se seu script está gerando erros também - já que você não os verá em seu terminal.

Além disso, tente usar um shebang na parte superior do seu arquivo PHP, para que o sistema saiba onde encontrar o PHP. Tal como:

#!/usr/bin/php

assim você pode chamar a coisa toda assim

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

Gary Jones
fonte
eu atualizo * / 5 * * * * mydomain.in/cronmail.php> / dev / null 2> & 1 Não estou recebendo e
Savan Paun
2
Você já tentou executar o script manualmente e não por meio do cron? O problema pode realmente ser com o próprio script.
Gary Jones,
5

Você está configurando seu cron para ser executado no 10º minuto a cada hora.
Para configurá-lo para every 5 minsmudar para*/5 * * * * /usr/bin/php /mydomain.in/cronmail.php > /dev/null 2>&1

Justinas
fonte
eu atualizo * / 5 * * * * mydomain.in/cronmail.php> / dev / null 2> & 1 Não estou recebendo e
Savan Paun
@ user3705511 Você esqueceu de executá-lo via php - usr/bin/phpparte faltando
Justinas
adicionado * / 5 * * * * usr / bin / php / mydomain.in / cronmail.php> / dev / null 2> & 1, mas ainda não recebeu e
Savan Paun
@ user3705511*/5 * * * * /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1
Justinas,
atualizado, mas ainda não recebo e-mail * / 5 * * * * usr / bin / php / meudomínio.in/cronmail.php> / dev / null 2> & 1
Savan Paun
5

Se você deseja executar um cron a cada nminuto, existem algumas opções possíveis, dependendo do valor de n.

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

Aqui, a solução é simples, fazendo uso da /notação:

# 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

Acima, nrepresenta o valor ne mrepresenta um valor menor que nou *. Isso executará o comando nos minutosm,m+n,m+2n,...

n NÃO divide 60

Se nnão dividir 60, você não pode fazer isso de forma limpa com o cron, mas é possível. Para fazer isso você precisa colocar um teste no cron onde o teste verifica o tempo. A melhor maneira de fazer isso é olhar o carimbo de data / hora UNIX, o total de segundos desde então 1970-01-01 00:00:00 UTC. Digamos que queremos começar a executar o comando pela primeira vez quando Marty McFly chegou em Riverdale e, em seguida, repeti-lo a cada nminuto depois.

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

Para que um cronjob seja executado a cada 42minuto após `2015-10-21 07:28:00 ', o crontab ficaria assim:

# 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

com minutetestcmddefinido como

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

Observação: tempo do UNIX não é influenciado por segundos bissextos

Observação: cron não tem precisão inferior a um segundo

kvantour
fonte
A m/nnotação parece não funcionar em meus sistemas (Debian 9, Ubuntu 16.04). Só */nfunciona. Por exemplo, 5/5ou 4/10forneça Error: bad minute; while reading /etc/crontabsyslog (no Ubuntu com cron v. 3.0pl1-128ubuntu2). Essa notação m / n foi abandonada ou está disponível apenas em alguns sistemas?
mivk
@mivk Obrigado por apontar isso. Isso foi um erro da minha parte. Deveria ter lido m-59/n. Apenas um intervalo pode ter um tamanho de etapa. (veja man 5 crontab). Eu atualizei a resposta
kvantour
3

2 etapas para verificar se um cronjob está funcionando:

  1. Faça login no servidor com o usuário que executa o cronjob
  2. Execute manualmente o comando php:

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

E verifique se algum erro é exibido

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

Para definir para x minutos, precisamos definir x minutos no primeiro argumento e, em seguida, o caminho do seu script

Por 15 minutos

*/15 * * * *  /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1
Javeed Shakeel
fonte
1
Isso NÃO executa as tarefas CADA x (15) minutos. Ele é executado em x (1) minutos após cada hora completa.
prata de