Magento 1.9.1 cron_schedule não é escolhido para sempre


12

Passei quase três dias e não consigo entender e criar o Magento Cron para processar as tarefas agendadas. Estou executando o Magento 1.9.1.0 e notei recentemente que os emails de pedidos agora estão na fila em vez de serem enviados instantaneamente. Entendo a necessidade, mas não consigo fazer com que o sistema escolha as filas.

Aqui está a minha opinião sobre Cronjob. insira a descrição da imagem aqui

Aqui está minha linha de comando do cronjob. insira a descrição da imagem aqui

Aqui está como as tarefas são criadas na tabela cron_schedule. insira a descrição da imagem aqui

Como os registros são criados na tabela cron_schedule, acho que o Cron está sendo executado uma vez a cada 5 minutos. Se eu excluir manualmente esses registros via PhpMyAdmin, os registros serão criados automaticamente após algum tempo.

Mas o status das tarefas permanece "pendente" e nunca completo. Não tenho certeza se algo está errado na minha configuração ou se está faltando alguma coisa. Alguém pode me ajudar como executar a tarefa agendada no prazo. Também por que vários registros são criados para um código de tarefa?

Atualizar

Limpei a tabela inteira e o cron criou os trabalhos agendados. Todos os trabalhos estão em estado pendente e nunca são executados, mesmo aguardando mais de 60 minutos. Algo está errado no Magento 1.9.1

Atualização 11/02: Hoje fiz mais algumas análises sobre o processo.

Eu editei o cron.php como abaixo

echo 'iam before mdefault 1';
shell_exec("/bin/sh $baseDir/cron.sh $fileName -mdefault 1 > /dev/null 2>&1 &");
echo 'iam before malways 1';
shell_exec("/bin/sh $baseDir/cron.sh $fileName -malways 1 > /dev/null 2>&1 &");
echo 'i returned success';

Editei a classe Mage_Cron_Model_Observer como abaixo

public function dispatch($observer) {
  echo 'iam inside dispath';

Meu entendimento era que quando o cron executa o comando -mdefault, ele deve chamar a função de despacho e a execução acontece. Mas o que aconteceu foi o seguinte na saída cron.

Content-type: text/html

iam before mdefault 1iam before malways 1i returned success

Isso significa que o despacho não chama todos ...

Uma outra tentativa

Mudei manualmente a variável $isShellDisabled = true;e a seguir, no cron.php.

if ($isShellDisabled) {
  echo 'before always';
  Mage::dispatchEvent('always');
  echo 'after always';
  Mage::dispatchEvent('default');
  echo 'after default';
} else {
  Mage::dispatchEvent($cronMode);
}

A saída cron para o acima é como abaixo

Content-type: text/html

before alwaysiam inside dispath alwaysafter always

Agora ele chama o 'dispatchAlways', mas não o 'dispatch'

Nenhuma das respostas me ajuda. Ele nunca escolhe as tarefas agendadas. Ou seja, quando o Cron é executado pela primeira vez, ele criou com êxito as tarefas na tabela. Mas nunca executa a tarefa.


O que acontece quando você executa o cron.php em um navegador da web? Será uma página em branco, mas quero dizer o que acontece com suas tarefas cron?
— Seanbreeden

Tente usar o script bash: */5 * * * * /bin/sh PATH_TO_PRODUCTION/cron.shse disponível.
— Phil Birnie

@seanbreeden, quando executo via URL no navegador, mostra uma página em branco. Nada aconteceu com as tarefas .. Eu atualizei a questão com o novo conjunto de tarefas criado ...
— Malaiselvan

@ PhilB, .sh não faz nenhuma diferença. É semelhante as tarefas pendentes estão pendentes para sempre, mas tenho certeza que o cron está sendo executado a cada 5 minutos.
— Malaiselvan

você tentou esvaziar a cron_schedulemesa? Verifique se ele ficar de preenchidos com novas tarefas depois de uma hora ou assim
— Sander Mangel

Respostas:


3

Era a versão PHP do Cron Jobs.

A versão do PHP foi definida corretamente para o site e é por isso que estava funcionando; no entanto, Cron Jobs estava sendo executado no PHP nativo do servidor 5.3, motivo pelo qual eu estava recebendo os erros apenas ao executar o Cron. Eu atualizei para a versão 5.5.

Comando Cron alterado:

php /home/mydomainname/public_html/cron.php
to
php55 /home/mydomainname/public_html/cron.php

ou no hostgator:

/opt/php55/bin/php /home/mydomainname/public_html/cron.php

no cron.php

$isShellDisabled = (stripos(PHP_OS, 'win') === false) ? $isShellDisabled : true;

Após essa linha, adicione:

$isShellDisabled = true;

A menção de executar o cron.php em uma versão específica do PHP (ea-php70 no meu caso) corrigiu os problemas nos quais eu estava executando: execute php -vno terminal para ver qual versão do PHP o terminal está usando. No meu caso, era 5,6. Então eu tive que forçar o uso do PHP 7.0 mudando phppara ea-php70in crontab -e. Obrigado!
— Daan van den Bergh

2

você tentou esvaziar a cron_schedulemesa? Verifique se está cheio de novas tarefas depois de uma hora ou mais.

Além disso, você pode usar Aoe_Scheduler para desativar cronjobs específicos. Veja se algum em particular pode causar um erro que interrompe todas as outras tarefas.

A maneira como os cronjobs do Magento são configurados como um erro fatal em um script causará falha na execução de todas as tarefas


Obrigado pela resposta. O erro fatal capturado em qualquer log? Atualizei mais algumas descobertas no meu caso e atualizei o mesmo na minha pergunta.
— Malaiselvan

@seanbreeden: Hoje notei que, quando inicio o Cron.php via navegador da Web, ele funciona muito bem escolhendo os horários. Isso prova que não há erro fatal em nenhum dos scripts. Alguma idéia de por que o cron não está sendo executado via crontab?
— Malaiselvan

2

Como primeiro passo, sugiro reverter suas configurações para as configurações cron padrão do Magento:

Padrões do Magento Cron

Há um problema nas suas configurações atuais: sua agenda é gerada a cada 15 minutos, mas agendada apenas por 5 minutos, deixando um intervalo de 10 minutos.


Obrigado. Mesmo depois de redefinir o padrão, ele não funciona. Quando é executado pela primeira vez, ele cria todos os trabalhos na tabela cron_schedule com o horário agendado. Os trabalhos nunca são escolhidos e permanecem na mesa como pendentes para sempre. Uma coisa que notei após a configuração $isShellDisabled = true;e quando inicio o Cron.php via navegador, os trabalhos são selecionados, mas não via CronTab.
— Malaiselvan

Este problema ainda não foi resolvido. Haverá algum problema com meu provedor de hospedagem. Vejo o script disparado em intervalos regulares, mas apenas os trabalhos não são selecionados. Também será um problema desde que eu migrei da 1.8?
— Malaiselvan

Seu cronjob tem memória suficiente? Experimente os logs de erros para verificar se há algo que possa ajudar.
— Kristof em Fooman, 22/03/2015

esse problema ainda não está resolvido ... Todos os dias estou quebrando a cabeça. Logs de erro? onde eu posso ver isso?
— Malaiselvan

@ Malaiselvan para registros de erros, consulte o administrador do sistema ou o host da web, pois eles devem saber o local e como acessar o registro de erros do servidor. Também pode ajudar a executar manualmente o trabalho cron a partir da linha de comando - tente os dois php -f cron.phpe ./cron.shverifique se eles produzem alguma coisa para investigar mais.
— Kristof at Fooman

1

O mesmo problema para mim.

Erro "Tarde demais ..." encontrado.

Após a limpeza da cron_scheduletabela, o cron.sh parou de funcionar (não está mais agendando).

Funcionou apenas após matar todos os processos antigos de Cron.


No meu caso, quando o Cron é executado pela primeira vez, ele criou com êxito as tarefas na tabela. Mas nunca executa a tarefa. :-(
— Malaiselvan

1

Eu tive o mesmo problema. Meu problema foi específico do fuso horário: as colunas created_ate scheduled_atna cron_scheduletabela devem ser UTC + 0, minhas entradas foram UTC + 2.

Para verificar isso, você pode simplesmente definir as datas de created_ate scheduled_atpara ontem e aguardar até o próximo cronograma.

Espero que ajude alguém!


1

No Bluehost, na mudança cron.sh

 PHP_BIN=`which php`

para

 PHP_BIN="php54s"

Por padrão, na hospedagem compartilhada, ele executa o PHP 5.2.

Eu também tive que mudar cron.php, substituindo as duas $isShellDisabledlinhas por $isShellDisabled = true;

Para se livrar dos avisos do PHP, eu também adicionei essas linhas antes

$_SERVER['SCRIPT_NAME'] = 

if (empty($_SERVER['SCRIPT_FILENAME'])) $_SERVER['SCRIPT_FILENAME'] = '~/public_html/cron.php';
if (empty($_SERVER['SCRIPT_NAME'])) $_SERVER['SCRIPT_NAME'] = '/cron.php';
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.