我在 CentOS 7 上,如果我输入:
* * * * * python script.py
有用。
如果我输入:
@reboot python script.py
然后它说无法连接到 MySQL。
如果我也从命令行运行它,它就可以工作。
仅当我这样做时,脚本才不起作用@reboot
。 cronjob 有可能在 MySQL 之前启动吗?
答案1
是的,这是可能的(而且很有可能)。
一个粗暴的解决方案是指示你的脚本休眠一段时间。例如,将你的 cron 行更改为如下内容:
* * * * * sleep 60; python script.py
这将等待 60 秒,这应该给 MySQL 启动的时间。
如果你必须绝对确保 mysql 进程在你的脚本运行之前启动,你可以编写一个像这样的 shell 包装器脚本(我们称之为custom_wrapper
):
/bin/bash #!/bin/bash while true; 执行 运行=`ps ax | grep mysql`; 如果 [ $running -eq 0 ]; 那么 python 脚本.py 退出 $? 菲 睡 5 完毕
然后,将其设置为可执行文件(chmod +x custom_wrapper
)并按如下方式修改您的 cron 行:
* * * * * custom_wrapper
自定义包装脚本等待 MySQL 进程变为活动状态,然后执行您的 python 脚本并退出。
答案2
是的,cron守护进程可以在mysql完成(甚至开始)其启动过程之前很容易启动。
答案3
是的,这绝对是可能的。Cron 是每个系统上的重要服务,并且很可能在 MySQL 等服务之前启动。
虽然可以改变顺序,但如果您不小心,这可能会搞砸您的系统。更好的选择是只在您的 cron 脚本中添加延迟,以便它等待足够长的时间以便 MySQL 运行(例如 60 秒)。
答案4
我感觉您正在尝试使用 cron 作为进程管理器。(@reboot
一次,* * * * *
而每分钟)。
更好的想法1:
使用 systemd(我认为是 EL 7 系统正在使用的,我自己还没有真正使用过它)。
更好的想法2:
有一个启动服务并管理锁定文件的初始化脚本(/var/log/subsys/SERVICE 是最好的,因为初始化脚本需要在 RHEL 框中管理该文件(至少在 7 之前是这样的,不确定在 7 中是否仍然如此)。
然后,从 crond(或您正在使用的任何配置管理系统,例如 cfengine、puppet、chef 等)调用/sbin/service SERVICE ensure-started
(其中ensure-started
可能是您添加的一些内容。我不记得是否condrestart
要这样做......)。
PS. 可以在 RHEL 系统上的 /usr/share/doc/sysvinit* 或类似目录中找到有关 init-scripts 的文档。