linux 计划任务分为单次计划任务和周期性计划任务,其中单次计划任务用at命令来执行,周期计划任务用crontab 命令来实现。实际工作中一般都用周期性计划任务,所以下面将重点讲解下周期性计划任务crontab。
一 . crontab 格式说明
Linux下的任务调度分为两类,系统任务调度和用户任务调度。
系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件,格式如下所示:
[wang@Centos6.9 ~]$cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
格式说明:
SHELL变量指定了系统要使用哪个shell,这里是bash
PATH 变量指定了系统执行命令的路径
MAILTO 变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务 执行信息给用户
HOME 变量指定了在执行命令或者脚本时使用的主目录
Minute Hour Day Month Dayofweek user-name command
分钟 小时 天 月 每星期几 用户 命令
每个字段代表的含义如下:
Minute 每个小时的第几分钟执行该任务
Hour 每天的第几个小时执行该任务
Day 每月的第几天执行该任务
Month 每年的第几个月执行该任务
DayOfWeek 每周的第几天执行该任务
Command 指定要执行的程序
在这些字段里,除了“Command”是每次都必须指定的字段以外,其它字段皆为可选字段。
对于不指定的字段,要用“*”来填补其位置。
这里有几个特殊符号的含义:
*“”代表取值范围内的数字,
“/”代表”每”,
“-”代表从某个数字到某个数字,
“,”分开几个离散的数字**
例如:
30 1 * * 6 copy /test /test/back/test.bak 指定每个星期6的1:30执行一次复制test 的命令
30 10 10 * * wang /wang/delet.sh
指定每月10号的10:30 wang 用户执行delet.sh 的脚本
30 10 10 * 0 wang copy test test.bak
****指定每月10号和每个星期天**的10:30 wang 用户执行复制test命令 (当 day 和 dayofweek 字段重合时候表示两个都执行**)
30 3 10,15 * * copy xx
每月10号和15号的3:30执行copy命令
25 8-10 * * * 每天8-10点的第25分钟
*/20 * * * * 每20分钟执行一次
30 20 */5 * * 每隔5天20:30执行一次
二、crontab 安装包和服务启动
计划任务相关的程序包如下:
1. cronie: 主程序包,提供crond守护进程及相关辅助工具。
crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
2. cronie-anacron: cronie的补充程序,用于监控cronie任
务执行状况,如cronie中的任务在过去该运行的时间点未能正常
运行,则anacron会随后启动一次此任务
3. crontabs:包含CentOS提供系统维护任务
查看crond守护进程运行状态:
**
CentOS 7: systemctl status crond
CentOS 6: service crond status
如: [wang@Centos6.9 ~]$service crond status
crond (pid 2317) is running...
[root@centos7 ~]#systemctl status crond
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
**Active**: active (running) since Sun 2017-08-27 22:18:18 HKT; 1s ago
Main PID: 46896 (crond)
CGroup: /system.slice/crond.service
└─46896 /usr/sbin/crond -n
**想执行周期性计划任务要确保crond 进程是运行状态!**
service crond status|stop centos6启动和停止crond 进程命令
systemctl start|stop crond centos7启动和停止crond命令
**
**
用户cron任务:
**
crontab命令是给普通用户来创建计划任务的,使用crontab命令定义可以实现每个用户都有专用的cron任务文件。常用选项如下:
crontab [-u user] [-l | -r | -e]
-l: 列出所有任务
-e: 编辑任务
-r: 移除所有任务
-i:同-r一同使用,以交互式模式移除指定任务
-u user: 仅root可运行,指定用户管理cron任务
普通用户通过crontab -e 来创建计划任务,格式就是上面的crontab 格式一样,只是不用写用户名选项,因为就是本用户嘛。
运行结果的标准输出和错误以邮件通知给相关用户,通过
cat /var/log/cron 查看计划任务日志文件。如果不想发送邮件给用户可以在命令后加上 &>/dev/null 就可以了。
对于cron任务来讲, %有特殊用途;如果在命令中要使用%,
则需要转义,将%放置于单引号中,则可不用转义。