关于crontab精确到秒的问题

最近在项目中遇到一个问题,linux上设置多个cron程序,每个程序都对数据库进行不同的select、update、insert等操作,且每分钟都执行一次,这样造成服务器的突发负荷有时会很高,甚至宕机。

分析原因:由于crontab最小只能精确到分钟,也就是说默认的每分钟同时对数据库进行操作,而且有可能是同一个表的不同级别的操作,这样就会使数据表 lock的机率更大,使其他操作无法完成,造成突发负荷过高,直至高优先级的操作完成而释放所才使得服务器负荷回落。

基于此,为了解决问题只能另辟蹊径:减少同时执行的程序。每个程序依旧是每分钟执行一次,但是不是每分钟的开始,可以分组为每分钟的10s,20s,30s等等,于是想到了sleep。

原始的crontab设置:
* * * * * cmd1
* * * * * cmd2
* * * * * cmd3
* * * * * cmd4
* * * * * cmd5
* * * * * cmd6
* * * * * cmd7
* * * * * cmd8
* * * * * cmd9
* * * * * cmd10

修改后crontab设置:
* * * * * sleep 10; cmd1
* * * * * sleep 10; cmd2
* * * * * sleep 20; cmd3
* * * * * sleep 20; cmd4
* * * * * sleep 30; cmd5
* * * * * sleep 30; cmd6
* * * * * sleep 40; cmd7
* * * * * sleep 40; cmd8
* * * * * sleep 50; cmd9
* * * * * sleep 50; cmd10

变通一下,如果想没20秒执行一次,直接用crontab是不能实现的,我们这样设置就可以实现了:

* * * * * cmd
* * * * * sleep 20; cmd
* * * * * sleep 40; cmd

当然这样看起来比较麻烦,可以用:while true; do  cmd; sleep 20; done这样的来替代上面的,不过没有用到这个,在这就不测试了,有用到或需要的可以试一试。



发表评论

您的电子邮箱地址不会被公开。

20 + = 22