Linux之crontab的应用
5年前
786
0
通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell脚本。
了解crontab
crontab 是linux定期来执行程序的命令,一般称为“定时任务”。
linux的crontab时间间隔单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常适合周期性的日志分析或数据备份等工作。
crontab基本格式:
* * * * * php test.php >> /dev/null 2>&1
#分 时 日 月 周 |《===========命令行=========》|
代表含义:
分 时 日 月 周
* * * * * user-name 命令
| | | | |
| | | | .----- 星期(0-6,0代表星期天)
| | | .--------- 月份(1-12)
| | .------------- 日期(1-31)
| .----------------- 小时(0-23)
.--------------------- 分钟(0-59)
第1列表示分钟1~59 每分钟用或者 /1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
使用crontab
crond服务操作命令:
service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置
service crond status //查看服务状态
cat /var/log/cron //查看定时任务是否准时调用了,可以/var/log/cron中的运行信息
cat /etc/passwd | cut -f 1 -d : |xargs -I {} crontab -l -u {} // 查看所有用户的crontab任务
cron常用方法:
crontab -u //设定某个用户的cron服务
crontab -l //列出某个用户cron服务的详细内容
crontab -r //删除没个用户的cron服务
crontab -e //编辑某个用户的cron服务
crontab -e 可以像使用vi编辑其他任何文件那样修改crontab文件并退出。如果修改了某些条目或添加了新的条目,那么在保存该文件时, cron会对其进行必要的完整性检查。
配置文件
在LINUX中,周期执行的任务一般由cron这个守护进程来处理[ps -ef|grep cron]。cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间。
/var/spool/cron/ 这个目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名,比如tom建的crontab任务对应的文件就是/var/spool/cron/tom。一般一个用户最多只有一个crontab文件。
特殊字符
字符 | 含义 |
---|---|
星号(*) | 代表每的意思,例如month字段如果是星号,则表示每月都执行该命令操作。 |
逗号(,) | 表示分隔时段的意思,例如,3, 4, 6, 8 标明这四个指定的整数。 |
中杠(-) | 表示一个时间范围,例如“2-6”表示“2,3,4,5,6”。 |
正斜线(/) | 可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。 |
井号开头(#) | 的行是注释,不会被处理。 |
使用实例
命令 | 含义 |
---|---|
* * * * * myCommand | 每1分钟执行一次 |
3,15 * * * * myCommand | 每小时的第3和第15分钟执行 |
3,15 8-11 * * * myCommand | 在上午8点到11点的第3和第15分钟执行 |
3,15 8-11 */2 * * myCommand | 每隔两天的上午8点到11点的第3和第15分钟执行 |
45 4 1,10,22 * * myCommand | 每月1、10、22日的4 : 45执行 |
10 1 * * 6,0 myCommand | 每周六、周日的1 : 10执行 |
0 23-7 * * * myCommand | 晚上11点到早上7点之间,每隔一小时执行 |
0 6-12/3 * 12 * myCommand | 在12月内, 每天的早上 6 点到 12 点,每隔 3 个小时 0 分钟执行 |
注意清理系统用户的日志
每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。 例如,可以在crontab文件中设置如下形式,忽略日志输出:
0 */3 * * * php test.php >/dev/null 2>&1 #不记录脚本输出记录
0 */3 * * * php test.php >> /logs/test.log 1>&1 #将脚本输出信息追加到test.log中
0 */3 * * * php test.php > /logs/test.log 1>&1 #将脚本输出信息记录到test.log中,注意使用 ‘>’ 会覆盖之前的数据
“/dev/null 2>&1”表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,这样日志输出问题就解决了。
定时任务书写要领
- 定时任务要加注释
- 定时任务命令或脚本结尾加 &>/dev/null 或 >/dev/null 2>&1 或 1>/dev/null 2>/dev/null
- 定时任务执行shell脚本前加/bin/sh,定时任务执行shell脚本不必添加执行权限
- 定时任务命令或程序尽量写到脚本里,定时任务只要执行脚本即可
注意操作步骤:
- 命令行执行
- 编写脚本
- 测试脚本
- 设置定时任务 - 生产任务程序不要随意打印输出信息
- 定时任务执行的脚本要规范路径 (例如 /server/script)
- 配置定时任务要规范操作过程
- 定时任务执行特殊的字符需要进行转义,否则会报错,例如 百分号% 转义 \%
- 定时任务脚本中如果涉及使用到环境变量,必须在脚本中重新定义,不然,定时任务识别不了
注意用法
星期和天尽量不要同时使用,他们触发的条件是只要满足一个就会执行。