【Linux】Crontab

Posted by 西维蜀黍 on 2020-05-05, Last Modified on 2022-03-25

区别

Cron: Cron comes from chron, the Greek prefix for ‘time’. Cron is a daemon which runs at the times of system boot.

Crontab: Crontab (CRON TABle) is a file which contains the schedule of cron entries to be run and at specified times. File location varies by operating systems.

  • crontab是一个文件(列举了要执行的cron服务的具体内容),也可以指Linux中的crontab 命令。

Cron job or cron schedule: Cron job or cron schedule is a specific set of execution instructions specifying day, time and command to execute. crontab can have multiple execution statements.

crond 系统服务

crond系统服务提供crontab命令来设定cron服务的。

在linux 系统中,由 crond这个系统服务来控制。Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。

我们可以看下crond这个系统服务的状态:

$ sudo systemctl status cron
● cron.service - Regular background program processing daemon
     Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2022-03-22 16:39:57 UTC; 39s ago
       Docs: man:cron(8)
   Main PID: 4344 (cron)
      Tasks: 1 (limit: 4626)
     Memory: 348.0K
        CPU: 41ms
     CGroup: /system.slice/cron.service
             └─4344 /usr/sbin/cron -f -P

Mar 22 16:39:57 esxiubuntu systemd[1]: Started Regular background program processing daemon.
Mar 22 16:39:57 esxiubuntu cron[4344]: (CRON) INFO (pidfile fd = 3)

启动crontab服务

$ systemctl start cron

查看服务是否已经运行用

$ ps -ax | grep cron

设置cron服务的两种方法

  • 在命令行中使用 crontab 来管理服务(添加/删除相应的任务),该命令其实会将设置的cron服务存储到 /var/spool/cron/ 目录下(以用户名作为子文件夹名称)
  • 直接编辑/etc/crontab文件,以添加相应的任务

crontab 命令

通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常适合周期性的日志分析或数据备份等工作。

crontab 命令格式

命令格式

$ crontab [-u user] file [ -e | -l | -r ]

命令参数:

  • -u user:用来选择当前crontab服务属于某个用户(或者查看某个特定用户的crontab服务);
  • file:指定 crontab命令文件的路径,表示将该file做为crontab的任务列表文件并载入crontab中。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。
  • -e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
  • -l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。
  • -r:从 /var/spool/cron 目录中删除某个用户的crontab文件(如果sw用户已经存在特定crontab服务,则存在 var/spool/cron/sw 文件夹),如果不指定用户,则默认删除当前用户的crontab文件。
  • -i:在删除用户的crontab文件时给确认提示。
# 设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数  
$ crontab -u
# 列出当前用户cron服务的详细内容
$ crontab -l
# 删除当前用户的所有crontab服务
$ crontab -r
# 编辑当前用户的crontab服务
$ crontab -e
# 比如说查看root的cron设置
$ crontab -u root -l
# root想删除fred的cron设置
$ crontab -u fred -r
# 在编辑cron服务时,编辑的内容有一些格式和约定。
# 进入vi编辑模式后,编辑的内容一定要符合下面的格式 */1 * * * * ls >> /tmp/ls.txt
$ crontab -u root -e  

crontab文件(任务调度设置文件)的语法

# 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


分			小时		日			月			星期			用哪个用户身份执行该命令			命令
0-59  0-23   1-31   1-12   0-6    	  user-name          	   command     (一行对应一个任务)

每个字段代表的含义如下:ba

  • Minute:每个小时的第几分钟执行该任务
  • Hour:每天的第几个小时执行该任务
  • Day:每月的第几天执行该任务
  • Month:每年的第几个月执行该任务
  • DayOfWeek:每周的第几天执行该任务(0表示星期天,1表示星期1,以此类推。也可以用英文来表示,sun表示星期天,mon表示星期一…)
  • user-name:用哪个用户身份执行该命令
  • Command:指定要执行的程序

在这些字段里,除了“Command”是每次都必须指定的字段以外,其它字段皆为可选。

记住几个特殊符号的含义:

  • *:代表取值范围内的任意数字
  • /:代表”每隔”
  • -:代表从某个数字到某个数字(范围)
  • ,:分开几个离散的数字(枚举多个值)

举例如下:

5       *       *           *     *     ls             # 指定每小时的第5分钟执行一次 ls 命令
30      5       *           *     *     ls             # 指定每天的 5:30 执行 ls 命令
30      7       8           *     *     ls             # 指定每月8号的7:30分执行 ls 命令
30      5       8           6     *     ls             # 指定每年的6月8日5:30执行 ls 命令
30      6       *           *     0     ls             # 指定每星期日的6:30执行 ls 命令。注:0表示星期天,1表示星期1,以此类推。也可以用英文来表示,sun表示星期天,mon表示星期一...
30      3      10,20        *     *     ls             # 每月10号及20号的3:30执行 ls 命令(“,” 用来连接多个不连续的时段)
25     8-11     *           *     *     ls             # 每天8-11点的第25分钟执行 ls 命令(“-”用来连接连续的时段)
*/15    *       *           *     *     ls             # 每15分钟执行一次 ls 命令 (即每个小时的第0 15 30 45 60分钟执行ls命令)
30      6     */10          *     *     ls             # 每个月中,每隔10天6:30执行一次 ls 命令(即每月的1、11、21、31日是的6:30执行一次 ls 命令)
 50     7       *           *     *     root     ls    # 每天 7:50 以 root 身份执行/etc/cron.daily目录中的所有可执行文件

Usage

# 周一到周五每天晚上23:30执行一次 ruijieclient -k
30 23 * * 1-5 /bin/swclient -k

# 每天每隔10分钟执行 `date`
*/10 * * * * date

# 每分钟执行一次 `date`
* * * * * date

Reference