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.

Malaiselvan
fonte
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;
Philippe
fonte
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

Sander Mangel
fonte
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.

Kristof na Fooman
fonte
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.

Rafael Patro
fonte
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!

Mario Haubenwallner
fonte
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';
Chris - na web design da grade
fonte