在 Linux,我们可以设置服务器的计划任务服务,把周期性、规律性的工作交给系统自动完成。计划任务可以这样理解:
- 一次性计划任务:只执行一次,可用于临时的工作需求,比如今晚 8:00 开启网站服务
- 周期性计划任务:比如每晚 3:00 备份下数据库
一次性计划任务
使用 at
命令。
# ------ 创建 ----------
# 今晚 8:00 开启网站服务
at 20:00
at > systemctl start nginx
# 然后按 ctrl+d 结束编写计划任务
# 或
echo 'systemctl start nginx' | at 20:00
# ----- 查看已设置好但还未执行的一次性计划任务 ----
at -l
# ----- 删除 ---------
atrm <任务序号> # at -l 可以看到
周期性计划任务
crontab 是用来定期执行程序的命令。Linux 安装完成后,默认便会启动此任务调度命令。Linux 任务调度的工作主要分为以下两类:
- 系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存
- 个人执行的工作:某个用户定期要做的工作,如每隔 10 分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置
crontab 命令需要 crond 服务支持。
# 启动
service crond start
# 重启
service crond restart
语法
crontab [ -u user ] { -l | -r | -e }
相关参数:
-
-u user
指设定指定 user 的时程表,前提必须要有其权限(比如 root)才能够指定他人的时程表。不使用则表示设定自己的时程表。 -
-e
执行文字编辑器(内定 vim)来设定时程表 -
-r
删除当前的时程表 -
-l
列出当前的时程表
时程表
时程表格式如下:
# 分-时-天-月-星期 <执行的命令或程序脚本>
* * * * * <command>
项目 | 含义 | 范围 |
---|---|---|
第一个"*" | 一小时当中的第几分钟(minute) | 0~59 |
第二个"*" | 一天当中的第几小时(hour) | 0~23 |
第三个"*" | 一个月当中的第几天(day) | 1~31 |
第四个"*" | 一年当中的第几个月(month) | 1~12 |
第五个"*" | 一周当中的星期几(week) | 0~7(0和7都代表星期日) |
command | 要执行的命令或程序脚本 |
对于时间的设置,有这些特殊符号:
特殊符号 | 含义 |
---|---|
*(星号) | 代表任何时间。 比如第一个"*"就代表一小时种每分钟都执行一次的意思。 |
,(逗号) | 代表不连续的时间。 比如"0 8,12,16***命令"就代表在每天的 8 点 0 分、12 点 0 分、16 点 0 分都执行一次命令。 |
-(中杠) | 代表连续的时间范围。 比如"0 5 ** 1-6命令",代表在周一到周六的凌晨 5 点 0 分执行命令。 |
/(正斜线) | 代表每隔多久执行一次。 比如"*/10****命令",代表每隔 10 分钟就执行一次命令。 |
当“crontab -e”编辑完成之后,一旦保存退出,那么这个定时任务实际就会写入 /var/spool/cron/ 目录中,每个用户的定时任务用自己的用户名进行区分。而且 crontab 命令只要保存就会生效,只要 crond 服务是启动的。
实例
假设在每周一、三、五的凌晨 3 点 30 分,使用 tar 命令把 /usr/www 目录进行打包处理
# 进入设定
crontab -e
30 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /usr/www
- 命令一定要用绝对路径的方式,不知道其绝对路径,可以用
whereis tar
-
分字段
必须有数值,绝对不能为空或是 * 号 -
日字段
和星期字段
不能同时使用,会发生冲突 - crontab 配置时,可以像 Shell 脚本那样以 # 号开头写上注释信息,以便维护
更多实例
# 在 22 点 45 分执行命令
45 22 * * * <command>
# 在每周一的 17 点 0 分执行命令
0 17 * * 1 <command>
# 在每月 1 日和 15 日的凌晨 5 点 0 分执行命令
0 5 1,15 * * <command>
# 在每周一到周五的凌晨 4 点 40 分执行命令
40 4 * * 1-5 <command>
# 在每天的凌晨 4 点,每隔 10 分钟执行一次命令
*/10 4 * * * <command>
# 在每月 1 日和 15 日,每周一个 0 点 0 分都会执行命令
0 0 1,15 * 1 <command>