Crontab-Linux 命令之定时自动启动任务

每个操作系统都有它的自动定时启动程序的功能,Windows 有它的任务计划,而 Linux 对应的功能是 crontab 命令。

at 命令是针对仅运行一次的任务,循环运行的例行性计划任务,linux 系统则是由 cron(crond) 这个系统服务来控制的。 Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。另外, 由于使用者自己也可以设置计划任务,所以,Linux 系统也提供了使用者控制计划任务的命令:crontab 命令。

crond 简介

crond 是 linux 下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与 Windows 下的计划任务类似,当安装完操作系统后,默认会安装此服务工具,并且会自动启动 crond 进程。 crond 进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

Linux 下的任务调度分为两类,系统任务调度和用户任务调度。

  • 系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。/etc/crontab 文件是系统任务调度的配置文件。
  • 用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的 crontab 文件都被保存在/var/spool/cron 目录中,其文件名与用户名一致。

系统管理员可以通过/etc/cron.deny/etc/cron.allow 这两个文件来禁止或允许用户拥有自己的 crontab 任务。

关于 crontab 的用途,在企业实际应用中非常广泛,常见的有定时数据备份、定时系统检测、定时数据收集、定时更新配置、定时生成报表等等。

Crontab 文件详解

/etc/crontab 文件内容包含包括以下内容

[root@localhost ~]# cat /etc/crontab
nstall crontabsSHELL=/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
 
51 * * * * root run-parts /etc/cron.hourly
24 7 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
[root@localhost ~]#

前四行是用来配置 crond 任务运行的环境变量

  • 第一行 SHELL 变量指定了系统要使用哪个 shell,这里是 bash,
  • 第二行 PATH 变量指定了系统执行命令的路径
  • 第三行 MAILTO 变量指定了 crond 的任务执行信息将通过电子邮件发送给 root 用户,如果 MAILTO 变量的值为空,则表示不发送任务执行信息给用户
  • 第四行的 HOME 变量指定了在执行命令或者脚本时使用的主目录。第六至九行表示的含义将在下个小节详细讲述。这里不在多说。用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 rontab 工具来定制自己的计划任务。所有用户定义的 crontab 文件都被保存在/var/spool/cron 目录中。其文件名与用户名一致。

Crontab 时间格式说明

Crontab 格式说明
分类第 1 个
*
第 2 个*第 3 个*第 4 个
*
第 5 个
*
command
名称minutehourdaymonthweekcommand
释义分钟小时日期月份星期要执行的命令
取值范围0-590-231-311-12
或 jan,feb,mar,apr…
0-7
或 sun,mon,tue,wed,thu,fri,sat 。
注意 0 和 7 均代表星期日
系统命令
编写的脚本

说明:

  • 所有用户 crontab 文件存放的目录, 以用户名命名
  • 用户所建立的 crontab 文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:minute hour day month week command
    • minute 表示分钟,可以是从 0 到 59 之间的任何整数。
    • hour 表示小时,可以是从 0 到 23 之间的任何整数。
    • day 表示日期,可以是从 1 到 31 之间的任何整数。
    • month 表示月份,可以是从 1 到 12 之间的任何整数。
    • week 表示星期几,可以是从 0 到 7 之间的任何整数,这里的 0 或 7 代表星期日。
    • command 要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

在以上各个字段的取值范围中,还可以使用以下特殊字符:

特殊字符说明
星号 (*)表示所有可能的值,例如:minute 是 *,表示每分钟都执行命令
横杆 (-)用于表示一个范围,例如:第 5 个字段 (星期几) 中的 1-5 每个工作日,即星期一到星期五
正斜线 (/)用正斜线指定时间的间隔频率,例如:minute 是/15,表示 15 分钟都执行命令
逗号 (,)用于分隔项目,例如:第二个 (hour) 字段 (小时) 中的 2,6,8 在凌晨 2 点、早上 6 点和早上 8 点执行
L仅允许用于  月份中的某天  或  星期几  字段,星期几  中的 2L  表示每个月的最后一个星期二
井号 (#)仅允许用于  星期几  字段,后面必须在 1 到 5 的范围内。例如,4#1  表示给定月份的 “第一个星期四” 。
问号 (?)可以代替 “*” 并允许用于月份和星期几。使用仅限于 cron 表达式中的 月份中的某天 或 星期几

时间设置示例

时间设置含义
* * * * *每分钟执行一次
0 * * * *每小时的第 0 分钟执行一次
0 0 * * *每天的午夜(0 点)执行一次
0 0 * * 0每周日的午夜(0 点)执行一次
0 0 1 * *每个月的第一天午夜(0 点)执行一次
0 0 L * *每个月的最后一天午夜(0 点)执行一次
0 0 1 1 *每年的第一天午夜(0 点)执行一次
0 0 * * 3每周三的午夜(0 点)执行一次
0 0 1,15 * *每个月的第 1 和第 15 天午夜(0 点)执行一次
0 0 * * FRI每周五的午夜(0 点)执行一次
0 0 * * 5每周五的午夜(0 点)执行一次
0 8-17 * * *每天的上午 8 点到下午 5 点每小时执行一次
0 12 * * MON每周一的中午(12 点)执行一次
0 0 15 * *每个月的第 15 天午夜(0 点)执行一次
0 0 * * 3每周三的午夜(0 点)执行一次
0 8-17 * * *每天的上午 8 点到下午 5 点每小时执行一次
0 0 * * 1-5每个工作日的午夜(0 点)执行一次
0 0 1 * FRI每个月的第一个星期五午夜(0 点)执行一次
0 0 1,15 * *每个月的第 1 和第 15 天午夜(0 点)执行一次
0 0 15 1 *每年的 1 月 15 日午夜(0 点)执行一次
0 0 * * 7每周日的午夜(0 点)执行一次
0 0 * * 5每周五的午夜(0 点)执行一次

crontab 命令详解

命令语法格式:

crontab [-u user] file
crontab [ -u user ] [ -i ] { -e | -l | -r }
crontab -n [ HOSTNAME ]
crontab -c

常用选项说明:

  • crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。
  • -u USER 是指用来设定某个用户的 crontab 任务,该参数仅有 root 权限才能设定。用于管理其他用户的定时任务。例如:crontab -u wanjia -l 表示 root 用户查看 wanjia 用户的 crontab 任务。
  • file 是命令文件的名字, 表示将 file 做为 crontab 的任务列表文件并载入 crontab 。如果在命令行中没有指定这个文件,crontab 命令将接受标准输入 (键盘) 上键入的命令,并将它们载入 crontab 。
  • -i 在删除用户的 crontab 任务前询问用户是否确定删除提示。
  • -e 编辑某个用户的 crontab 文件内容。如果不指定用户,则表示编辑当前用户的 crontab 任务,任务保存在/var/spool/cron 目录下与用户名同名的文件中。
  • -l 显示某个用户的 crontab 文件内容,如果不指定用户,则表示列出显示当前用户的 crontab 定时任务。
  • -r/var/spool/cron 目录中删除某个用户的 crontab 文件,如果不指定用户,则默认删除当前用户的 crontab 任务。

其他选项说明:

  • -s 在进行编辑/替换之前,将当前的 SELinux 安全上下文字符串作为 MLS_LEVEL 附加到 crontab 文件
  • -n [HOSTNAME]此选项只有当 cron(8) 使用-c 选项启动以支持集群环境时才使用,用于指定集群中哪个主机执行定时 crontab 文件中的定时任务。如果省略了主机名,则使用 gethostname(2) 返回的本地主机名
  • -c 此选项只有当 cron(8) 使用-c 选项启动以支持集群环境时才使用,用于查询集群中当前哪个主机执行定时 crontab 文件中的定时任务

使用实例

使用 root 管理员登录 SSH,输入命令 nano /etc/crontab 编辑 crontab 文件,根据格式要求输入并保存

  • 保存:使用 Ctrl + O 来保存所做的修改、退出编辑器:使用 Ctrl + X 退出编辑器
含义说明
* * * * * command每 1 分钟,执行一次 command 命令
3,15 * * * * command每小时的第 3 和第 15 分钟,执行一次 command 命令
3,15 8-11 * * * command8 点到 11 点的第 3 和第 15 分钟,执行一次 command 命令
3,15 8-11 */2 * * command每隔两天的 8 点到 11 点的第 3 和第 15 分钟,执行一次 command 命令
3,15 8-11 * * 1 command每星期一的 8 点到 11 点的第 3 和第 15 分钟,执行一次 command 命令
0 2 * * * /root/test.s每天 2 点,执行 root 目录下的 test.sh 脚本。
0 23 * * 6 /etc/init.d/smb restart每星期六的 23 点,执行重启 smb 命令
* */1 * * * /etc/init.d/smb restart每一小时,执行重启 smb 命令
30 21 * * * /etc/init.d/smb restart每晚的 21:30,执行重启 smb 命令
0 4 2 jan * /etc/init.d/smb restart1 月 2 号的 4 点,执行重启 smb 命令
10 1 * * 6,0 /etc/init.d/smb restart每周六、周日的 1 点 10,执行重启 smb 命令
* 23-7/1 * * * /etc/init.d/smb restart23 点到早上 7 点之间,每隔一小时,执行重启 smb 命令
0,30 18-23 * * * /etc/init.d/smb restart每天 18 至 23 之间每隔 30 分钟,执行重启 smb 命令
45 4 1,10,22 * * /etc/init.d/smb restart每月 1 、 10 、 22 日的 4 点 45,执行重启 smb 命令
0 11 4 * mon-wed /etc/init.d/smb restart每月 4 号与每周一到周三的 11 点,执行重启 smb 命令
5 23 * * * root /home/mysql_data/mysql_databak.sh每天 23 点 05 分,执行/home/mysql_data/mysql_databak.sh 的文件命令
01 * * * * root run-parts /etc/cron.hourly每小时执行/etc/cron.hourly 目录内的脚本命令

使用者也可以将所有的设定先存放在文件中,用 crontab file 的方式来设定执行时间。

crontab 用法其实很容易掌握,懂得使用 crontab,对网站和服务器维护起到很大的帮助,比如定时备份,定时优化服务器等。

参考资料:

  • https://www.nasge.com/archives/45.html
  • https://www.amjun.com/397.html
  • Linux crontab 命令,https://www.runoob.com/linux/linux-comm-crontab.html
  • crontab(1) command_cron table,https://dablelv.blog.csdn.net/article/details/103264609
  • 计划任务之 crontab ,https://zhuanlan.zhihu.com/p/594333950
上一篇 各品牌主板、笔记本、台式机的U盘启动快捷热键大全对照图表
下一篇 DockerHub容器国内镜像加速源