Linux的一些知识(9)
一. 定时任务
1. Linux 定时任务简介
计划任务 是需要在指定时间执行的任务或者是周期性执行的任务,比如凌晨3点重启设备,每周对日志文件备份等。Linux 系统会内置 at 和 cron 服务,at 服务用来指定时间执行任务,cron 用来周期性执行任务。
2. at 一次性任务
at 定时任务依赖于Linux 系统的 atd 服务,如果atd 服务不开启,则at 则不起作用,查看 atd 服务开启命令如下:
systemctl status atd
如果显示如下,则表示atd 服务已经开启:
如果没有 atd 服务,或者是没有 at 命令,则可能是 系统在最小化安装的时候没有装at,此时我们可以 yum 安装at 软件,命令如下:
yum install -y at
at 定时任务相关文件主要有以下2个:
- /etc/at.deny
- /etc/at.allow
at.deny 表明不允许哪个用户执行at 服务,at.allow 表明允许那个用户执行at 服务。默认情况下,at.deny 文件存在而ar.allow 文件不存在,而当at.deny 和 at.allow 文件同时存在时,at.allow 文件则会失效,只有当at.deny 文件不存在时,at.allow文件才会生效。
at 命令常用参数如下:
- -l 表示列出所有的at 定时任务
- -d 表示删除指定的at 定时任务
- -c 表示查看指定的at 定时任务
- -t 表示后面跟字符串化的时间参数
at 命令使用实例如下:
at 00:00 #表示凌晨0点执行
at 2:30pm #表示下午两点半执行
at now+10min #表示十分钟后执行
at 4pm+4days #表示4天以后的下午4点执行
at 10 Jan 31 #表示1月31号上午(不指名上午还是下午就使用24h)10点执行
at -t 202122221300 #2021年11月11日13点执行
我们在键入上述命令并回车后,就会进入at 任务的交互式界面,此时就可以键入我们的定时任务了。在写完以后,ctrl +d 表示保存任务并退出,ctrl+c 表示不保存退出。
at 定时任务编辑如下:
如果定时任务比较长,我们也可以写成脚本,然后使用输入重定向或者 -f 参数的方式来编辑,如下所示:
如果我们想删除at 定时任务,就可以使用 -d 参数,删除过程如下所示:
3. cron 周期性任务
任务调用的crond 常驻命令
crond 是linux 用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此任务调度命令。
crond 命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。而linux 任务调度的工作主要分为以下两类:
- 系统执行的工作:系统周期性要执行的工作,如备份系统数据、清理缓存
- 个人执行的工作:某个用户定期要做的工作,例如每隔10分钟见擦汗邮件服务器是否有新信,这些工作可由每个用户自行设置
crontab 是Unix 系统下的定时任务触发器,其使用者的群贤记载在下列文件中:
/etc/cron.deny 该文件中所列的用户不允许使用 crontab 命令
/etc/cron.allow 该文件中所列的用户允许使用crontab 命令
/var/spool/cron/ 是所有用户的crontab 文件
/var/spool/cron/crontabs
控制定时任务
cron 是一个linux 下的定时执行工具,可以在无需人工干预的情况下运行作业。
/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重启载入配置
/sbin/service crond status //查看服务状态
cron 周期性任务依赖于系统后台的 crond 进程,类似于 at,我们也要首先确认cron 服务是否开启,执行命令:
systemctl status crond
如果出现如下结果,就表示crond 任务已经开启。
cron 定时任务分为系统的定时任务和用户的定时任务。
crond 定时任务主要文件如下:
1、/var/spool/cron/
该文件主要用于存放用户设置的定时任务,会以用户名来命名,当用户创建cron 定时任务时,就会在该目录下生成一个同名文件,该文件存储了用户定时任务的具体信息。
2、/etc/cron.deny /etc/cron.allow
与at 定时任务类似,cron.allow 存放了运行创建定时任务的用户,而cron.deny 则存放了不允许创建定时任务的用户,只有当cron.deny 不存在时,cron.allow 才会生效。
3、/etc/cron.monthly/
该文件用来存放系统每个月需要执行的脚本
4、/etc/cron.weekly/
该文件用来存放系统每周需要执行的脚本
5、/etc/cron.daily/
该文件用来存放系统每天需要执行的脚本
6、/etc/cron.hourly/
该文件用来存放系统每小时需要执行的脚本
执行命令 crontab 可以使我们创建定时任务,该命令常用参数如下:
crontab [-u username] [-l | -e | -r]
- -u 只有root才能进行这个任务,也即帮其他用户新建/删除 crontab工作调度;
- -e 表示新创建或编辑定时任务
- -r 表示删除定时任务
- -l 表示显示定时任务
因此,执行命令:
crontab -e
即可以创建一个定时任务了。
创建定时任务需要遵循一定的规范,在crond 文件中,前面的五列都代表一个时间,从左到右分别是 分钟、小时、天、月、星期,如果不做设置,可以用* 跳过,最后一列表示要执行的任务。
在每一列对应的地方写入具体数值就可以表示定时执行,还可以使用锻钢表示一段时间,如果* 后面加入斜杠,则表示每隔该段时间就执行一次。
crond 定时任务时间设置示例如下:
0 3 * * * #表示每天3点执行
0 */3 * * * #表示每隔3小时执行
0 3 2 * 3 #表示每个月2号的3点或者每周三的3点执行
* * * * * #表示每分钟执行一次
* 1-10 * * * #表示每天的1点到10点执行
使用
1.为当前用户创建cron服务。键入 crontab -e 编辑crontab 服务文件
例如 文件内容为:
*/2 * * * * /bin/sh /data/test.sh
*/2 * * * * 设置什么时候执行脚本
/bin/sh /data/test.sh 可以设定要执行的脚本,需要注意以下 bin/sh 是指运行脚本的命令,后面一段时指脚本存放的路径。
2.查看该用户下的crontab 服务是否创建成功,用 crontab -l 命令
crontab -l
3.启动crontab服务
一般启动服务用 /sbin/service crond start 若是根用户的cron 服务可以用 sudo service crond start
4.查看服务是否已经运行
ps -ax |grep cron
5.crontab 命令
cron 服务提供crontab 命令来设定cron 服务的,以下是这个命令的一些参数与说明:
crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
crontab -l //列出某个用户cron服务的详细内容
crontab -r //删除某个用户地cron服务
crontab -e //编辑某个用户地cron服务
比如说
root 查看自己地cron 设置:crontab -u root -l
root 想删除fred地cron设置:crontab -u fred -r
在编辑cron 服务时,编辑地内容有一些格式和约定,输入:crontab -u root -e
进入vi 编辑模式,编辑地内容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt
7.cron文件语法:
分 小时 日 月 星期 命令
0-59 0-23 1-31 1-12 0-6 command
星期中的 0 代表周日
几个特殊符号的定义:
* 代表取值范围内的数字
/ 代表“每”
- 代表从某个数字到某个数字
,分开几个离散的数字
一般一行对应一个任务
在这些字段中,除了“command” 是每次都必须指定的字段意外,其它字段皆为可选字段,可视需要决定。对于不指定的字段,要用“*”来填补其位置。
可能遇到的问题及解决方法
权限问题
定时任务往往会出现权限问题
crontab 权限问题到 /var/adm/cron/ 下一看,文件 cron.allow 和cron.deny 是否存在
用法如下:
- 如果两个文件都不存在,则只有root用户才能使用crontab命令。
- 如果cron.allow 存在但cron.deny 不存在,则只有列在cron.allow 文件里的用户才能使用crontab 命令,如果root用户也不在里面,则root用户也不能使用crontab.
- 如果cron.allow不存在,cron,deny 存在,则只有列在cron.deny 文件里面的用户不能使用crontab 命令,其它用户都能使用。
- 如果两个文件都存在,则列在cron.allow 文件中而且没有列在cron.deny 中的用户可以使用crontab,如果两个文件中都有同一个用户,以cron.allow文件里面是否有该用户为准,如果cron.allow 中有该用户,则可以使用crontab 命令。
脚本注意事项
- 定时任务要加注释
- 定时任务命令或脚本结尾加 &>/dev/null 或 >/dev/null 2>&1 或 1>/dev/null 2>/dev/null (输出重定向)
- 定时任务执行shell脚本前加/bin/sh,定时任务执行shell脚本不必添加执行权限
- 定时任务命令或程序尽量写到脚本里,定时任务只要执行脚本即可
注意操作步骤:
(1)命令行执行
(2)编写脚本
(3)测试脚本
(4)设置定时任务
- 生产任务程序不要随意打印输出信息
- 定时任务执行的脚本要规范路径(例如 /server/script)
- 配置定时任务要规范操作过程
- 定时任务执行特殊的字符需要进行转义,否则会报错
- 定时任务脚本中如果涉及使用到环境变量,必须在脚本中重新定义,不然,定时任务识别不了
输出重定向
当执行定时任务出现错误时,需要将信息输出,如果没有配置重定向,则默认将信息存储到相应用户下面的文件中 /var/log/mail/${user},不方便查找。因此,需要配置重定向将不同的执行脚本输出到不同的日志中。
示例
0 */2 * * * /test/test.sh >> /home/work/log/test.log 2>&1
其中 >> 表示将输出追加到test.log文件中,2>&1 表示将标准错误重定向到标准输出。
二.date命令
Linux date命令可以用来显示或设定系统的日期与时间。在显示方面使用者可以设定欲显示的格式,格式设定为一个加号后接数个标记。在备份文件的时候我们常结合此命令生成当前日期和时间的文件名。格式符前面以 + 开头,若是不以 + 开头,则表示要设定时间,而时间格式为MMDDhhmm[[CC]YY][.ss]
,其中MM为月份,DD为日,hh为小时,mm为分钟,CC为年份前两位数字,YY 为年份后两位数字,ss为秒数。
使用
- 获取命令帮助
date --help
- 查看命令版本
date --version
- 查看系统日期及时间
[kaifa@hbase197 /]$ date
Tue Sep 27 15:52:37 CST 2022
- 以YYYY-MM-DD显示日期
[kaifa@hbase197 /]$ date +%F
2022-09-27
[kaifa@hbase197 /]$ date '+%F'
2022-09-27
- 以MM/DD/YY 显示日期
[kaifa@hbase197 /]$ date +%D
09/27/22
- 以MM/DD/YYYY 显示日期
[kaifa@hbase197 /]$ date +%x
09/27/2022
- 获取系统年份、月份、日子
[kaifa@hbase197 /]$ date +%Y
2022
[kaifa@hbase197 /]$ date +%m
09
[kaifa@hbase197 /]$ date +%d
27
- 获取系统星期值
[kaifa@hbase197 /]$ date +%a
Tue
[kaifa@hbase197 /]$ date +%A
Tuesday
[kaifa@hbase197 /]$ date +%u
2
[kaifa@hbase197 /]$ date +%w
2
- 获取系统时区
[kaifa@hbase197 /]$ date +%z
+0800
[kaifa@hbase197 /]$ date +%Z
CST
- 查询当前日期是一年中的第几周
[kaifa@hbase197 /]$ date +%W
39
[kaifa@hbase197 /]$ date +%U
39
- 获取系统时间
[kaifa@hbase197 /]$ date +%T
16:03:45
[kaifa@hbase197 /]$ date +%X
04:03:49 PM
- 显示十二小时制时间
[kaifa@hbase197 /]$ date +%r
04:04:20 PM
- 显示24小时制时间
[kaifa@hbase197 /]$ date +%R
16:05
- 按照指定样式显示时间
[kaifa@hbase197 /]$ date +%H-%M-%S
16-07-02
[kaifa@hbase197 /]$ date +%H.%M.%S
16.07.10
- 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数
[kaifa@hbase197 /]$ date +%s
1664266097
- 设置系统时间
date -s 10:00:00
date -s 10:00:00 20220101
- 日期和时间分行显示
[kaifa@hbase197 /]$ date +%F%n%T
2022-09-27
16:10:38
- 按照字符串设置显示日期
# 七天前
[kaifa@hbase197 /]$ date -d '7 days ago' +%Y%m%d
20220920
# 一个月后
[kaifa@hbase197 /]$ date -d 'next month' +%Y%m%d
20221027
# 一年前
[kaifa@hbase197 /]$ date -d '+1 year ago' +%Y%m%d
20210927
使用语法以及参数说明
1. 使用语法
用法: date [参数选项] [+格式]
或者:
date [-u|–utc|–universal] [MMDDhhmm[[CC]YY][.ss]]
2. 参数说明
参数 | 参数说明 |
---|---|
-d,–date=string | 显示 datestr 中所设定的时间(非系统时间) |
-s,–set=string | 将系统时间设为 datestr 中所设定的时间 |
-u,–utc,–universal | 打印或设置协调世界时(UTC) |
-version | 显示版本信息 |
-help | 显示帮助信息 |
3. 时间格式符号
符号 | 符号说明 |
---|---|
%n | 下一行 |
%t | 跳格 |
%H | 小时(00…23) |
%I(大写I) | 小时(01…12) |
%k | 小时(0…23) |
%l(小写l) | 小时(1…12) |
%M | 分钟(00…59) |
%p | 显示本地 AM 或 PM |
%r | 直接显示时间 (12 小时制,格式为 hh:mm:ss [AP]M) |
%R | 24小时制方式显示时间,相当于%H:%M |
%s | 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数 |
%S | 秒(00…60) |
%T | 直接显示时间 (24 小时制) |
%X | 相当于 %H:%M:%S |
%z | 数字方式显示时区 |
%Z | 字母缩写方式显示时区 |
4. 日期格式符号
符号 | 符号说明 |
---|---|
%a | 星期几 ,缩写(Sun…Sat) |
%A | 星期几 ,完整英文星期(Sunday…Saturday) |
%b | 月份 (Jan…Dec) |
%B | 月份 (January…December) |
%c | 直接显示日期与时间 |
%d | 日 (01…31) |
%D | 直接显示日期 (mm/dd/yy) |
%e | 一个月中的第几天,类似%_d |
%F | 完整的日期,相当于%Y-%m-%d |
%h | 同 %b |
%j | 一年中的第几天 (001…366) |
%m | 月份 (01…12) |
%u | 一周中的第几天 (1…7) (1是星期一) |
%U | 一年中的第几周 (00…53) (以 Sunday 为一周的第一天的情形) |
%w | 一周中的第几天 (0…6)(0是星期天) |
%W | 一年中的第几周 (00…53) (以 Monday 为一周的第一天的情形) |
%x | 直接显示日期 (mm/dd/yy) |
%y | 年份的最后两位数字 (00.99) |
%Y | 完整年份 (0000…9999) |