很多时候需要代码定时定点去执行,比如说写了一段爬取网站信息的代码,想每天早上进行一次爬取,就需要为系统添加计划任务。而在Linux系统下,系统计划任务可以通过crond来实现。那么crond是什么呢,以下摘录自网络:
crond的概念和crontab是不可分割的。crontab是一个命令,常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。来自:百度百科
Crond服务会定期(默认每分钟检查一次)检查系统中是否有要执行的任务工作。如果有,便会根据其预先设定的定时任务规则自动执行该定时任务工作。这个Crond定时任务服务就相当于我们早上使用的闹钟一样。来自:Linux公社
说白了就是,我们可以通过自己编写定时规则来实现一些定时任务
下面先介绍一下crond的基本命令:
crond status:查看crond服务状态
crond start:启动crond服务
crond stop:关闭crond服务
crond restart:重启crond服务
crontab -u:设定某个用户的crond服务
crontab -l:列出某个用户的crond内容
crontab -r:删除某个用户的crond服务
crontab -e:编辑某个用户的crond服务内容
*有时在启动crond时会出现crond: can't lock /var/run/crond.pid, otherpid may be 15340: Resource temporarily unavailable
的提示,只需用killall crond
结束所有crond服务再重新启动即可
接下来是crond编写格式:
在以上各个字段中,还可以使用以下特殊字符:
星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。来自:CSDN
比如:
0 1 * * * /bin/echo 'test' > /home/test.log
表示每天01:00打印字符串‘test’到/home/test.log文件中
又比如:
*/5 * * * * /home/test.sh
表示每隔5分钟执行/home/test.sh脚本
再比如:
0 1,2 * * 3 /home/test.sh
表示每周3的01:00和02:00分别执行一次/home/test.sh脚本
crond定时任务添加规范:
- 添加注释
- 定时任务最好以脚本(.sh)的形式执行
- 执行shell脚本任务前加
/bin/sh
- 所有路径都要写全路径(包括应用程序的路径),比如要定时执行python程
序,执行命令不能简单写作python ***.py
,python程序的完整路径也要写- 编写执行脚本要注意不要和window混用,要在纯linux环境下编写,否则会
因平台保存文件格式不同出现-bash: ./***.sh: /bin/bash^M: bad interpreter: No such file or directory
的错误- 编写好的执行脚本最好先在命令行验证一下,在添加进计划任务中
- 定时任务命令或脚本结尾加>/dev/null 2>&1
完整的计划任务实例:
crond添加定时任务
0 1 * * * /home/test.sh
test.sh: #遇到权限问题执行chmod u+x test.sh
#!/bin/sh /usr/bin/python /home/test.py > /dev/null 2>&1