Estou no CentOS 7, e se eu colocar:
* * * * * python script.py
Funciona.
Se eu colocar:
@reboot python script.py
Em seguida, ele diz que não pode se conectar ao MySQL.
Se eu executá-lo na linha de comando também, funcionará.
O script só não funciona se eu fizer isso @reboot
. É possível que o cronjob esteja iniciando antes do MySQL?
Sim, o cron daemon pode facilmente inicializar antes que o mysql tenha concluído (ou mesmo iniciado) seu processo de inicialização.
Sim, isso é absolutamente possível. Cron é um serviço importante em todos os sistemas e provavelmente será iniciado antes de algo como o MySQL.
Embora seja possível alterar a ordem, isso tem o potencial de estragar seu sistema se você não for muito cuidadoso. Uma alternativa melhor seria apenas adicionar um atraso ao seu script cron para que ele aguarde o tempo suficiente para que o MySQL esteja em execução (por exemplo, 60 segundos).
Sim, é possível (e muito provável).
Uma solução grosseira é instruir seu script a dormir algum tempo. Por exemplo, altere sua linha do cron conforme abaixo:
* * * * * sleep 60; python script.py
Isso aguardará 60 segundos, o que deve dar tempo ao MySQL para iniciar.
Se você precisa ter certeza absoluta de que o processo mysql foi iniciado antes de seu script ser executado, você pode escrever um script shell wrapper como este (vamos chamá-lo de
custom_wrapper
):Em seguida, defina como executável (
chmod +x custom_wrapper
) e modifique sua linha do cron conforme abaixo:* * * * * custom_wrapper
O script wrapper personalizado espera que o processo do MySQL se torne ativo, execute seu script python e saia.
Tenho a sensação de que você está tentando usar o cron como supervisor de processo. (
@reboot
é uma vez enquanto* * * * *
é a cada minuto).Melhor ideia 1:
Use o systemd (acho que o que os sistemas EL 7 estão usando, ainda tenho que brincar com isso sozinho).
Melhor ideia 2:
Tenha um script de inicialização que inicie o serviço e gerencie um arquivo de bloqueio (/var/log/subsys/SERVICE seria melhor, pois espera-se que um script de inicialização gerencie isso em uma caixa RHEL (bem, pelo menos antes de 7, não tenho certeza se isso ainda é verdade em 7).
Em seguida, a partir do crond (ou qualquer sistema de gerenciamento de configuração que você esteja usando, como cfengine, puppet, chef, etc.) chame
/sbin/service SERVICE ensure-started
(onde oensure-started
seria algo adicionado por você. Não me lembro secondrestart
foi feito para fazer isso ou não. ...).PS. A documentação para scripts de inicialização pode ser encontrada em /usr/share/doc/sysvinit* ou similar em sistemas RHEL.