Linux 命令之crontab
命令简介
在服务器安装好系统及相关服务之后,对于系统的配置、服务的配置、数据的管理以及服务器的操作权限管理就变的尤为重要。因为,涉及到服务器的各项安全(如:登录、操作)。
crontab 命令用来打开 cron 表进行编辑。
定时任务:顾名思义,就是定期执行某项操作或者某种行为。像Windows系统同样它也有定时任务服务。
在Linux系统中,crond是Linux系统中用来定期执行命令、脚本或指定程序的一种服务。定时任务一般有以下两种用途:
-
1、系统自身定期执行的操作或任务(如:日志轮询)。
-
2、用户定期执行的操作或任务(如:定时更新同步数据、重要数据备份等)。
Linux下的任务调度分为两类:系统任务调度和用户任务调度
系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc/目录下有一个crontab文件,这个就是系统任务调度的配置文件。
/etc/crontab 文件内容如下
[root@centos7 ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=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
从上机的配置文件,可以看出系统定时任务格式/etc/crontab分为6段,以空格分隔。前5段为时间格式,第6段是所需执行的命令。详细的说明:
minute #分钟,可以是从0到59之间的任何整数
hour #小时,可以是从0到23之间的任何整数
day #日期,可以是从1到31之间的任何整数
month #月份,可以是从1到12之间的任何整数
week #星期,可以是从0到7之间的任何整数,这里的0或7代表星期日
command #执行的命令,可以是系统命令,也可以是自己编写的脚本文件
在上述的配置字段中,还会使用到下面的特殊字符
*(星号) #表示所有值。比如在第一段中如果使用*,则表示在满足其他条件的同时每分钟都执行后面的命令操作。
,(逗号) #用逗号分隔的值表示指定的一个范围。比如在第四段使用1,3,5,7,则表示在第1,3,5,7月的含义。
—(中杠) #表示一个范围。比如在第二段使用0-8,则表示0点到8点这一区间范围。
/(正斜线) #表示一个时间的间隔频率。比如在第一段使用*/5,则表示每间隔5分钟的含义。
语法格式
crontab [-u user] file
crontab [-u user] [-l | -r | -e] [-i] [-s]
选项说明
-e #编辑该用户的计时器
-l #列出该用户的计时器
-r #删除该用户的计时器
-u<用户名称> #指定要设定计时器的用户名称
-i:在删除定时任务列表时进行确认提示
-s:显示该用户的下一个定时任务执行时间
定时任务书写与配置
书写定任务规范
在日常实际生产、测试环境中,书写定时任务是需要遵守一定的规范、规则的。笔者根据自己实际生产环境书写经验,总结如下:
-
1、书写定时任务时必须对每一行或一段加上注释信息。
-
2、如里是以shell脚本执行的任务,在最前面加上解释/bin/sh。
-
3、对于执行脚本的定时任务,需在其结尾加上>/dev/null 2>&1将一些不必要的输出信息重定向到空,也就是不输出不需要的信息。
-
4、使用系统或服务命令要使用绝对路径,再写到脚本,最后将脚本写进定时任务中。
-
5、规范使用目录(如定时任务执行的脚本目录设置成/server/cron_scripts)。
2)定时任务配置
实际生产、测试环境,对于定时任务的配置也是需要有一定操作规范的,具体如下:
-
1、对于执行命令的形式的定时任务,需要先测试命令执行情况,确认无误后将执行的命令写进脚本。
-
2、对于脚本形式的定时任务,首先就是需要调试脚本的整体执行情况,然后使用规范目录路径写进定时任务。
-
3、对于生产环境的定时任务操作,必须在测试环境进行反复测试,确认无误后再应用到实际生产环境中,然后在定时任务执行后人工进行检查执行情况。
对于定时任务的具体实例及各类操作,可参考官方文档说明。读者也可在自己的实验环境进行书写、配置,本章节就不做过多赘述。
应用举例
查看当前登录用户下的定时任务情况
[root@centos7 ~]# crontab -l
no crontab for root
每小时的第5和第15分钟执行
5,15 * * * * command_name
在上午9点到11点的第5和第15分钟执行
5,15 9-11 * * * command_name
每隔3天的上午9点到11点的第5和第15分钟执行
5,15 9-11 */3 * * command_name
每个星期一的上午9点到11点的第5和第15分钟执行
5,15 9-11 * * 1 command_name
每月1、11、21日的14:45重启httpd
45 14 1,11,21 * * /etc/init.d/httpd restart
每周六、周日的1:10重启smb
10 1 * * 6,0 /etc/init.d/httpd restart
每小时执行/etc/scripts/test.sh这个脚本
01 * * * * /etc/scripts/test.sh
拓展
在Linux中,设置定时任务的方法有多种。以下是常见的几种方法及其使用说明:
- 使用crontab命令:
- 使用
crontab -e
命令编辑当前用户的cron表。 - 在打开的文件中,每一行代表一个定时任务,使用cron表达式来指定任务执行的时间。
- 例如,以下示例将在每天的上午9点运行脚本
/path/to/script.sh
:
- 使用
0 9 * * * /path/to/script.sh
- 保存并关闭文件后,cron会自动加载更新后的cron表。
- 使用
crontab -l
命令查看当前用户的cron表。
- 编辑系统级的/etc/crontab文件:
- 使用文本编辑器打开
/etc/crontab
文件。 - 每一行代表一个定时任务,使用cron表达式来指定任务执行的时间和要执行的命令。
- 例如,以下示例将在每天的上午9点运行脚本
/path/to/script.sh
:
- 使用文本编辑器打开
0 9 * * * root /path/to/script.sh
- 保存并关闭文件后,cron会自动加载更新后的cron表。
- 使用
crontab -l
命令查看当前用户的cron表。
- 使用/etc/cron.d/目录:
- 在
/etc/cron.d/
目录中创建一个文件,文件名可以自定义,但不要包含.
或/
字符。 - 文件内容格式与crontab相同,使用cron表达式来指定任务执行的时间和要执行的命令。
- 例如,创建一个名为
mytask
的文件,内容如下:
- 在
0 9 * * * root /path/to/script.sh
- 保存文件后,cron会自动加载更新后的cron表。
- 使用
crontab -l
命令查看当前用户的cron表。
- 使用systemd的定时器:
- 创建一个
.timer
文件,用于配置定时器的触发条件和要执行的任务。 - 创建一个
.service
文件,用于定义要执行的任务的具体命令和其他设置。 - 将这两个文件放置在
/etc/systemd/system/
目录中。 - 运行
systemctl daemon-reload
命令,以重新加载systemd配置。 - 使用
systemctl start mytimer.timer
命令启动定时器。 - 使用
systemctl enable mytimer.timer
命令将定时器设置为开机启动。 - 使用
systemctl status mytimer.timer
命令查看定时器的状态。
- 创建一个
这些方法之间的区别主要在于使用的工具和配置方式。crontab
命令和/etc/crontab
文件是传统的cron工具,适用于简单的定时任务。/etc/cron.d/
目录允许将定时任务分散到多个文件中,更灵活。使用systemd的定时器提供了更精确的时间控制和更高级的功能,适用于需要更复杂任务调度的场景。
选择最好的方法取决于您的具体需求和使用场景。如果只需要为当前用户设置定时任务,使用crontab
命令是最简单和常见的方法。如果需要为整个系统或其他用户设置定时任务,可以选择编辑/etc/crontab
文件或使用/etc/cron.d/
目录。如果您使用的是systemd
作为初始化系统,并且需要更高级的功能和集成,可以考虑使用systemd
的定时器。
请根据您的具体需求和系统配置选择最适合您的方式,并参考相关文档以获取更详细的使用说明。
systemd进程管理工具详细教程请看这:Linux 命令之systemd