区别
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
- https://blog.csdn.net/capecape/article/details/78515558
- https://blog.csdn.net/xiyuan1999/article/details/8160998
- https://blog.csdn.net/Hot_VC/article/details/48261195
- https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/crontab.html
- https://www.jianshu.com/p/838db0269fd0
- https://stackoverflow.com/questions/21615673/difference-between-cron-crontab-and-cronjob