Linux下的定时任务
前言
同步数据之类的工作需要定时去完成, 如果要人工去做, 那是费时费力的。
既然是定时, 有规律可循, 那就应该使用编程完成, 而不是依赖人力完成。Java
有 Quartz
可以完成。Linux
和 Windows
也有相同的工具。
一次执行和多次执行
一次执行: at
命令, 需要atd
服务的支持。
多次执行: crontab
命令, 需要crond
服务的支持。
只执行一次的定时任务
打开atd服务
1 | # 确保打开 atd |
指定允许使用at的用户
at
有两个重要的文件, 用来限制可以使用at
定时任务的用户。
一个用户名占一行。/etc/at.allow
白名单和/etc/at.deny
黑名单。at
根据文件是否存在判断使用白名单或者黑名单。
/etc/at.allow |
/etc/at.deny |
说明 |
---|---|---|
√ | 无论是否存在 | 只允许/etc/at.allow 的用户执行at |
× | √ | 禁止/etc/at.deny 的用户执行at |
× | × | 只有root 能执行at |
例子
1 | # 1. 创建一次性的5分钟后创建文件的定时任务 |
其他的时间格式
除了用now + 5 minutes
指定时间外, 还有其他的时间格式
时间格式 | 说明 |
---|---|
HH:MM | 在HH时MM分执行一次 |
HH:MM YYYY-MM-DD | 在YYYY年MM月DD日HH时MM分执行一次 |
HH:MM[am/pm] [Month] [Date] | 在Month月Date日早上/下午HH时MM分执行一次, 月份是英文表示 |
HH:MM[am/pm] + number [minutes/hours/days/weeks] | 在早上/下午HH时MM分的number分钟/小时/天/周后执行一次 |
batch空闲时运行
batch
可以控制在工作负载低于0.8
的时候执行一次定时任务。
工作负载为1, 说明这个时间点有1个程序在运行。
工作负载为2, 说明这个时间点有2个程序在运行。
负载越高, 说明CPU单位时间内切换程序的次数越多。
当然, 程序不可能一直在运算, 所以也有低于1的情况产生。batch
可以避免在程序繁忙的时候执行一些操作, 比如定时重启。让定时任务延后运行。
可以看到最后一行代码是执行了at
命令, 只是附带了一些参数而已。
和at
命令一样的用法。
1 | [root@localhost ~]# nl /usr/bin/batch |
多次执行的定时任务
Java
下有Quartz
这个定时任务框架, 也使用到了corn
表达式。Linux
下的多次执行的定时任务是通过cron
服务实现的。
检查crontab
工具是否安装: crontab -l
检查crond
服务是否启动: service crond status
指定允许使用cron的用户
和at
一样, cron
也有两个文件用来限制可以使用cron
定时任务的用户。
一个用户名占一行。/etc/cron.allow
白名单和/etc/cron.deny
黑名单。
/etc/cron.allow |
/etc/cron.deny |
说明 |
---|---|---|
√ | 无论是否存在 | 只允许/etc/cron.allow 的用户执行cron |
× | √ | 禁止/etc/cron.deny 的用户执行cron |
× | × | 只有root 能执行cron |
配置文件
/etc/crontab
文件存储了系统的定时任务/var/spool/cron/用户名
文件存储了各个用户的定时任务/etc/cron.allow
文件指定了允许执行定时任务的白名单/etc/cron.deny
文件指定了允许执行定时任务的黑名单
通过查看/etc/crontab
可以看到看到系统的定时任务
1 | [root@localhost ~]# cat /etc/crontab |
cron表达式
从上可以看出cron表达式的格式如下
分 | 时 | 日 | 月 | 星期几 | 用户名 | 命令 | |
---|---|---|---|---|---|---|---|
取值范围 | 0~59 | 0~23 | 1~31 | 1~12 | 0~7(0或7都是星期天) | 可选 | 命令 |
1 | [root@localhost ~]# who |
例子
具体的用法, 只要看懂下面几个例子就行了
1 | # 每天21:30重启apache |