Linux 定时任务 crontab 教程

crontab logo

crontab 介绍

在 Linux 系统中,crontab 是用于安排周期性执行任务的工具。许多系统级的计划性任务就是通过 cron 服务来管理的,该服务默认情况下是开启的,每分钟会检查是否有任务需要执行。crontab 命令允许用户设置和管理自己的计划任务。

crontab 文件

系统的计划任务配置存储在 /etc/crontab 文件中,例如在 CentOS 7 中,该文件通常包含以下内容:

[root@VM_105_191_centos ~]# cat /etc/crontab 
SHELL=/bin/bash #使用哪个shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin #系统命令的路径
MAILTO=root  #任务执行结果通知给root用户,不写则不通知

# 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

crontab 配置格式

/etc/crontab 文件中可以看到详细的crontab 周期任务配置格式说明,我们按照文件中的内容可以很好的理解五个*号区域所代表的意思。

# 指令格式说明:
# .---------------- 分 (0 - 59)
# |  .------------- 时 (0 - 23)
# |  |  .---------- 日 (1 - 31)
# |  |  |  .------- 月 (1 - 12)
# |  |  |  |  .---- 星期 (0 - 6) (星期日=0 或 7) 
# |  |  |  |  |
# *  *  *  *  * 操作指令

这里有两点需要注意:

  • 如果日期和星期同时被设定,那么其中的一个条件被满足时,指令便会被执行。
  • 最小周期为分钟,而不是秒钟。

例如,若要在每小时的第 3 分钟执行命令 myCommand,可以如下配置:

3 * * * * myCommand

crontab 命令使用

crontab 命令用于管理 Linux 中的定时任务。下面是此命令的常见用法。

用法:
 crontab [参数] 文件 
 crontab [参数]
 
常用参数:
 -u <user>  配置用户计划任务,默认当前用户
 -e         编辑用户计划任务,默认当前用户
 -l         列出用户计划任务,默认当前用户更
 -r         清空用户计划任务,默认当前用户
 -i         删除用户计划任务,有确认提示

简单用法,如果要把一个编写好的 crontab 文件添加到当前用户的计划任务,可以使用下面命令。

$ crontab crontab_file

然后可以使用 crontab -l 命令查看当前用户的计划任务。

root@ubn:~# crontab -l
3 * * * * myCommand
root@ubn:~#

crontab 任务查看

用户定制的周期性计划任务保存在 /var/spool/cron/crontabs 目录中,文件名对应用户名。例如,查看 root 用户的定时任务:

$ cat /var/spool/cron/crontabs/root

# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (cron.sh installed on Wed Feb 21 18:36:31 2024)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
3 * * * * myCommand

crontab 常用定时示例

实例1:每1分钟执行一次myCommand

* * * * * myCommand

实例2:每小时的第3和第15分钟执行

3,15 * * * * myCommand

实例3:在上午8点到11点的第3和第15分钟执行

3,15 8-11 * * * myCommand

实例4:每隔两天的上午8点到11点的第3和第15分钟执行

3,15 8-11 */2 * * myCommand

实例5:每周一上午8点到11点的第3和第15分钟执行

3,15 8-11 * * 1 myCommand

实例6:每晚的21:30重启smb

30 21 * * * /etc/init.d/smb restart

实例7:每月1、10、22日的4 : 45重启smb

45 4 1,10,22 * * /etc/init.d/smb restart

实例8:每周六、周日的1 : 10重启smb

10 1 * * 6,0 /etc/init.d/smb restart

实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb

0,30 18-23 * * * /etc/init.d/smb restart

实例10:每星期六的晚上11 : 00 pm重启smb

0 23 * * 6 /etc/init.d/smb restart

实例11:每一小时重启smb

* */1 * * * /etc/init.d/smb restart

实例12:晚上11点到早上7点之间,每隔一小时重启smb

0 23-7 * * * /etc/init.d/smb restart

通过这些示例,你可以看到 crontab 的强大功能和灵活性,能够满足各种定时任务的需求。