A minha tarefa do cron não corre no VPS: as causas habituais

Quando uma tarefa do cron não corre num VPS, a causa quase nunca é o cron: é o ambiente em que ele corre. O cron arranca com um ambiente mínimo, sem o seu PATH, sem o seu terminal e sem o seu directório de trabalho. O comando que funciona na linha de comandos falha lá. A cura é usar caminhos completos, redirecionar a saída para um ficheiro, e ler esse ficheiro.

Passo a passo

1 Veja a tarefa. crontab -l lista as do seu utilizador (sudo crontab -l -u root as do root). Tarefas de sistema estão em /etc/crontab e /etc/cron.d/ e levam uma coluna extra com o nome do utilizador.
2 Confirme que o serviço está activo. systemctl status cron em Debian e Ubuntu; systemctl status crond em AlmaLinux e Rocky.
3 Veja se o cron chegou a tentar. Em Debian e Ubuntu, grep CRON /var/log/syslog | tail; em qualquer sistema com systemd, sudo journalctl -u cron (ou -u crond). Se a linha aparece, o cron correu o comando e o problema está dentro dele.
4 Capture a saída. Acrescente ao fim da linha >> /var/log/meu-cron.log 2>&1 (crie o ficheiro ou use uma pasta onde o utilizador possa escrever). Espere uma execução e leia o ficheiro: o erro estará lá.
5 Use caminhos completos. /usr/bin/php /var/www/seudominio.tld/tarefa.php em vez de php tarefa.php. Descubra o caminho com which php. Se o script abre ficheiros por caminho relativo, comece a linha por cd /pasta &&.
6 Experimente o mesmo comando, mas com o ambiente do cron: env -i /bin/sh -c "o_seu_comando". Se falha assim, é o ambiente.

As causas, por ordem de frequência

Sintoma Causa e remédio
Funciona no terminal, falha no cron PATH e ambiente mínimos. Caminhos completos para o programa e para os ficheiros; variáveis definidas no próprio crontab ou no script.
Nada no registo do cron O serviço está parado, ou o ficheiro de crontab tem um erro de sintaxe. Os cinco campos de tempo são: minuto, hora, dia do mês, mês, dia da semana.
O script “não tem permissão” Falta o bit de execução (chmod +x script.sh), ou o utilizador do cron não lê a pasta: permissões de ficheiros.
Uma linha com % parte-se No crontab, o % significa nova linha. Escape-o com \%, por exemplo em date +\%F.
Corre à hora errada O cron usa o fuso horário do servidor. Veja-o com timedatectl. Uma tarefa “às 2” é às 2 desse fuso, não às suas. Para o acertar: o fuso horário e o relógio do VPS.
Corre, mas não faz nada O comando termina com erro que ninguém vê. Sem redireccionamento da saída, o cron tenta mandá-la por e-mail local, que ninguém lê.
Corre duas vezes ao mesmo tempo A tarefa anterior ainda não acabou. Use flock para impedir sobreposições.
Não edite o crontab de outro utilizador por engano. Uma tarefa que escreve ficheiros como root numa pasta do site deixa-os com dono root, e o site deixa de os conseguir alterar. Ponha a tarefa no crontab do utilizador que é dono dos ficheiros (sudo crontab -e -u nomedoutilizador).
Cuidado com tarefas que apagam. Ensaie primeiro à mão e com uma pasta de ensaio. Uma linha com um caminho mal escrito e um rm é difícil de desfazer, e num VPS as cópias são suas: copiar um VPS.
Para tarefas com PHP e para cópias automáticas temos artigos prontos: correr um script PHP a partir do cron e cópias automáticas da sua aplicação. Sobre cron em geral e no painel de hospedagem: tarefas cron.

Dúvidas sobre o que está do nosso lado, como a máquina ligada ou a rede? Abra um pedido e vemos.

Abrir um pedido de suporte

VEJA TAMBÉM

Onde estão os registos num VPS Linux

Permissões de ficheiros num VPS

Correr um script PHP a partir do cron

Cópias automáticas da sua aplicação

PRODUTO RECOMENDADO

Servidor VPS com acesso root

Recursos só seus, o sistema que escolher, reinstalação quando quiser. desde 7.560,00 Kz/mês (plano de 3 anos, com cupão)

Ver planos
  • 0 Utilizadores acharam útil
Esta resposta foi útil?