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.logO 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:runSe 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:installEle 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:
| Grupo | Job | O que quebra sem ele |
|---|---|---|
| default | sales_send_order_emails | e-mail de pedido não sai |
| default | sales_grid_order_async_insert | pedido some do grid do admin |
| index | indexer_reindex_all_invalid | índice fica inválido para sempre |
| index | indexer_update_all_views | preço e estoque não atualizam na vitrine |
| consumers | consumers_runner | fila 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
- Configure cron jobs — Adobe Experience League
- Magento_Indexer: etc/crontab.xml — Magento no GitHub
- Magento_Sales: etc/crontab.xml — Magento no GitHub
- Magento_Cron: CronCommand.php — Magento no GitHub