CLI & Operação

Como provar em 2 minutos que o cron do Magento não roda

Quando três problemas aparecem juntos — pedido parado, e-mail que não sai e índice inválido — quase sempre é um só: o cron morreu.

Por Roger Takemiya · Publicado em · 5 min de leitura

O cliente reclama que não recebeu o e-mail do pedido. O admin mostra aquele aviso amarelo de "One or more indexers are invalid". A imagem do produto novo continua sem thumbnail. Parecem três problemas diferentes, com três culpados diferentes.

É um só. Sem cron, o Magento vira uma loja que só faz o que acontece na hora do clique. Todo o resto — e-mail, índice, fila, agregação de relatório — depende de alguém chamar bin/magento cron:run de minuto em minuto.

Os três comandos que provam

Primeiro, veja se a linha existe. O instalador do Magento marca o bloco dele com dois comentários:

crontab -l | grep -A2 'MAGENTO START'

Se não voltar nada, acabou o mistério: não tem cron instalado para esse usuário. Cuidado aqui, porque crontab -l mostra o crontab do usuário que está logado. Se o site roda como www-data e você está como deploy, você está olhando a caixa errada.

Segundo, o log. São dois arquivos diferentes e vale conhecer os dois:

tail -n 30 var/log/cron.log
tail -n 30 var/log/magento.cron.log

O cron.log é o que o próprio Magento escreve quando um job dá erro. O magento.cron.log é a saída bruta da linha do crontab — é lá que aparece erro de PHP, de permissão e de caminho.

Terceiro, roda na mão e vê o que acontece:

php bin/magento cron:run

Se o e-mail sair e o índice voltar ao normal depois disso, você acabou de provar que o agendamento é o problema, não a loja.

Deixe o Magento escrever a linha

Não precisa montar o crontab na unha:

php bin/magento cron:install

Ele escreve um bloco entre #~ MAGENTO START e #~ MAGENTO END, com o caminho certo do PHP e da loja, jogando a saída em var/log/magento.cron.log. Se já existir um bloco desses e você quiser refazer, use --force — ele só mexe no que está entre os marcadores. Para tirar, bin/magento cron:remove.

Um detalhe que estraga tudo: rode isso como o usuário dono dos arquivos da loja, nunca como root. Cron instalado no crontab do root grava log e cache com dono errado, e aí você troca um problema por outro bem pior.

Frequência: de minuto em minuto. Vários jobs do core estão agendados como * * * * *, e o grupo index tolera só 2 minutos de atraso antes de marcar a execução como perdida.

O que exatamente para de funcionar

Vale saber o nome dos jobs, porque assim você liga o sintoma à causa na hora:

GrupoJobO que quebra sem ele
defaultsales_send_order_emailse-mail de pedido não sai
defaultsales_grid_order_async_insertpedido some do grid do admin
indexindexer_reindex_all_invalidíndice fica inválido para sempre
indexindexer_update_all_viewspreço e estoque não atualizam na vitrine
consumersconsumers_runnerfila parada: imagem, exportação, importação

Todos esses estão agendados de minuto em minuto no core. Não é exagero de configuração, é o desenho do sistema.

Cron rodando e job parado assim mesmo

Se o comando na mão devolve Cron is disabled. Jobs were not run., alguém desligou o cron no app/etc/env.php. Procure por 'cron' => ['enabled' => 0] e ligue de volta. É comum ficar esquecido depois de uma migração de servidor.

Se não é isso, o diagnóstico está na tabela cron_schedule. Cada linha tem um status: pending, running, success, missed ou error. Muitos missed significa cron rodando com frequência baixa demais. Linha travada em running há horas costuma ser processo morto que não liberou o lock; matar o processo e apagar aquela linha resolve.

Perguntas rápidas

Posso rodar o cron de 5 em 5 minutos para aliviar o servidor?

Não compensa. O grupo index tolera só 2 minutos de atraso antes de marcar a execução como perdida, e vários jobs do core são agendados a cada minuto. O ganho de CPU é pequeno e o preço é índice desatualizado.

O cron não imprime nada no log quando roda pelo crontab. Isso é ruim?

É normal. O Magento só escreve a mensagem Ran jobs by schedule quando a saída é um terminal de verdade. Chamado pelo crontab, ele trabalha calado. Silêncio no magento.cron.log é sinal de que nada deu errado, não de que nada rodou.

O cron:install não escreveu nada. Por quê?

Ele não sobrescreve um bloco Magento já existente sem a opção --force. Rode crontab -l para ver se o bloco está lá e use bin/magento cron:install --force para regravar.

Pra conferir na fonte

  1. Configure cron jobs — Adobe Experience League
  2. Magento_Indexer: etc/crontab.xml — Magento no GitHub
  3. Magento_Sales: etc/crontab.xml — Magento no GitHub
  4. Magento_Cron: CronCommand.php — Magento no GitHub

cron operação crontab

Precisa de um orçamento? Ficarei feliz em ajudar. Clique Aqui