Linux crontab命令详解
Cron是Unix或类Unix计算机操作系统中基于时间的作业调度器。您可以使用Cron来安排作业,即在指定的时间、日期或间隔执行命令或shell脚本。例如,允许您自动化系统维护或管理,从网上下载文件或定期发送电子邮件。它是一个守护进程,即始终在服务器上运行的后台进程。Cron应该执行的任务称为CronJobs。Cron这个名字最初来自希腊时间之神“chronos”。
CronJobs的应用场景
CronJobs可用于单个命令或自动执行定期重复的顺序任务,例如,通过删除过时的条目、日志文件和注释来清理数据库,或创建网站用户数量的定期统计数据。
其他应用程序包括更新RSS提要、在特定日期将新内容发布到网站、生成多张发票或自动分发时事通讯。同样,可以使用CronJobs计划数据库备份。
CronTab文件的结构和语法
Cron使用特殊的配置文件,即所谓的CronTab文件,其中包含要执行的Cron作业的列表。CronTab代表Cron表。CronTab文件中的每一行代表一个CronJob。它看起来类似于由一个空格分隔的一行列。每一行都指定了特定命令或脚本的执行时间和频率。
在CronTab文件中,空行或以#、空格或制表符开头的行将被忽略。以#开头的行被视为用户评论。
CronTab中的有效行要么声明环境变量,要么定义CronJob。活动行中不允许有注释。
通过键入crontab -e
,可以在命令行解释器中访问CronTab文件。CronTab文件中的命令及其运行时由Cron守护进程检查,后者在系统后台执行这些命令。每个CronTab都有以下基本结构,有六列像表格一样排列:
* * * * * command to execute
前五列包含时间值,用于定义应执行命令的时间。从左到右分别是:
- minute-分钟,指定为0-59
- hour-小时,指定为0-23
- day-天,指定为1-31
- month-月份,指定为1-12
- week-工作日,指定为0-7,0或7是星期日
对于这些值中的每一个,通配符“*”可用于在任何时间(即在任何分钟、小时、天、月或工作日)执行,“*/n”可用于每n(分钟、小时等)执行一次,而“n、x、y”可用于在n、x或y上执行。最后一列指定要执行的脚本的相对或绝对路径。当月份或工作日的分钟、小时、月和日与当前时间匹配时,将执行CronJob。
Crontab宏
有些Cron实现还支持宏,使用这些字符串代替CronTab文件中的前五个字段。每个字符串指定一个特定的频率:
@reboot /var/tmp/my_script
时机 | 描述 | 等价的crontab表达式 |
---|---|---|
@yearly | 每年1月1日午夜执行一次 | 0 0 1 1 * |
@monthly | 每月第一天午夜执行一次 | 0 0 1 * * |
@weekly | 每周在周日午夜执行一次 | 0 0 * * 0 |
@daily | 每天午夜执行一次 | 0 0 * * * |
@hourly | 每小时开始时执行 | 0 |
@reboot | 系统启动时一次性执行 |
Crontab命令
命令 | 作用 |
---|---|
crontab-l | 列出当前用户的作业 |
crontab -r | 删除当前用户的所有作业。 |
crontab-e | 编辑当前用户的作业。 |
crontab[文件名] | 删除所有作业,并替换为从[filename]读取的作业。如果没有指定文件,将使用stdin。 |
Cron常见示例
1.每年2月2日执行一次任务
每年在2月的某个特定日期运行一次备份脚本。
0 9 2 2 * /usr/local/bin/yearly_backup
2.每天每小时在第五分钟执行一次任务
使用以下命令在每天的第五分钟每小时运行一次脚本:
5 * * * * $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
3.每天午夜后5分钟执行一次任务
使用以下命令在每天午夜后运行5分钟:
5 0 * * * $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
4.在每个月的第一天的特定时间执行一次任务
使用以下命令在每月1日下午2:15运行:
15 14 1 * * * $HOME/bin/monthly
5.仅在工作日(不包括周六和周日)的特定时间执行
使用以下命令在工作日的晚上10点运行:
0 22 * * 1-5 $HOME/bin/weekday.job >> $HOME/tmp/out 2>&1
6.在单个cron作业中调度多个作业
我们还可以使用分号(;)在单个cron作业中调度多个作业分开的工作如下所示:
0 12 * * * /var/tmp/script01.sh; /var/tmp/script02.sh
7.使用范围指定开始时间
可以使用连字符指定范围。值为1-5表示此字段对数字1到5有效。如果使用名称而不是数字,则无法指定范围。指定范围的示例如下所示。作业计划每小时从下午3点运行到晚上10点。
* 3-10 * * * /var/tmp/script.sh
8.使用步长值指定开始时间
阶跃值可以与范围一起使用。要指定步长值,请在范围后面加一个正斜杠(/)和一个数字。指定的数字是步长值。例如,下面指定每三个值(在本例中为2、5、8和11)应匹配一次:
* 0-12/3 * * * /var/tmp/script.sh
步长值也可以与星号一起使用。小时字段中的值*/3每三小时匹配一次(0、3、6、9、12、15、18和21)。
9.使用列表指定开始时间
名单也是可以接受的;列表中的每一项都用逗号分隔。通常将列表与范围结合使用,例如:
1-15,31-45 * * * * /var/tmp/script.sh
这个例子匹配从1到15以及从31到45的所有数字(在我们的例子中是分钟)。如果使用名称而不是数字,则无法指定列表。
10.在每月1日、10日和22日凌晨4:45执行一次任务
下面是一个在一个月的几个特定日子的特定时间运行作业的示例。
45 4 1,10,22 * * /apps/bin/backup.sh
CronJob常见问题解答
1.*在Cron中是什么意思?
星号*在Cron中用作通配符。*将任务的执行设置为任何分钟、小时、天、工作日或月。
2.Cron的用途是什么?
Cron允许您安排作业并自动执行定期任务,例如定时删除日志、发邮件。
3.什么是CronTab?
crontab是包含单个cronjob的文件。
4.如何安排每天凌晨2点备份的CronJob?
每天凌晨2点进行的定时备份可能如下所示:
0 2 * * * /bin/sh backup.sh
5.cron中特殊字符的含义
- *:代表所有可能的值。
- -:表示指定范围,小时子表达式中 10-15, 代表10,11,12,13,14,15小时触发任务
- ,:表示列出枚举值,小时子表达式中 11,12 代表11或者12小时触发任务。
- /:被用于指定增量。小时子表达式中,“0/1”表示从0分钟开始,每1小时执行一次。“3/2”表示从第3小时开始,每2小时执行一次。