我在 CentOS 7 上,如果我输入:
* * * * * python script.py
有用。
如果我放:
@reboot python script.py
然后它说它无法连接到 MySQL。
如果我也从命令行运行它,它可以工作。
如果我这样做,该脚本才不起作用@reboot
。cronjob 是否可能在 MySQL 之前启动?
我在 CentOS 7 上,如果我输入:
* * * * * python script.py
有用。
如果我放:
@reboot python script.py
然后它说它无法连接到 MySQL。
如果我也从命令行运行它,它可以工作。
如果我这样做,该脚本才不起作用@reboot
。cronjob 是否可能在 MySQL 之前启动?
是的,在 mysql 完成(甚至开始)它的启动过程之前,cron 守护进程可以很容易地启动。
是的,这是绝对可能的。Cron 是每个系统上的一项重要服务,并且可能会在 MySQL 之类的系统之前启动。
虽然可以更改顺序,但如果您不格外小心,这可能会破坏您的系统。一个更好的选择是在你的 cron 脚本中添加一个延迟,这样它就会等待足够长的时间让 MySQL 运行(例如 60 秒)。
是的,这是可能的(而且很有可能)。
一个粗略的解决方案是指示您的脚本休眠一段时间。例如,如下更改您的 cron 行:
* * * * * sleep 60; python script.py
这将等待 60 秒,这应该让 MySQL 有时间启动。
如果您必须绝对确定 mysql 进程在您的脚本运行之前启动,您可以编写一个这样的 shell 包装脚本(让我们称之为
custom_wrapper
):然后,设置为可执行文件 (
chmod +x custom_wrapper
) 并修改您的 cron 行,如下所示:* * * * * custom_wrapper
自定义包装脚本等待 MySQL 进程激活,然后执行您的 python 脚本并退出。
我感觉您正在尝试使用 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。init-scripts 的文档可以在 /usr/share/doc/sysvinit* 或 RHEL 系统上的类似文件中找到。