shell脚本中那些关于时间的处理方案,你都掌握了吗?
Posted 互联网老辛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本中那些关于时间的处理方案,你都掌握了吗?相关的知识,希望对你有一定的参考价值。
文章目录
前言
大家好,我是互联网老辛,专注云原生领域的终身学习者,期待与你一起成长。
🏠个人主页:[互联网老辛](https://zmedu.blog.csdn.net)
🧑个人简介:互联网老辛,云原生领域讲师,创业公司负责人 😉😉
💕 座右铭: 向内归因,一切问题先从自身找原因 🍺🍺🍺
💕欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信😘
一. linux中关于时间的命令有哪些?
作为一个技术人,提到时间,或许你第一时间想到的就是代码中与时间处理相关的bug,或者关于闰年,时区的处理,着实让人头疼。
今天我们就不聊这些让人头疼的事情了,而是一起来看看在linux系统中那些好玩的命令和脚本。
你还记得有哪些吗?
1.1 命令一: hwclock
当我们要查看与设置当前的Bios时间的是哪个命令?
是的,就是那个 hwclock命令,我们用–help查看以下帮助:
[root@itlaoxin41 ~]# hwclock --help
用法:
hwclock [功能] [选项...]
功能:
-h, --help 显示此帮助并退出
-r, --show 读取硬件时钟并打印结果
--set 将 RTC 设置为 --date 指定的时间
-s, --hctosys 从硬件时钟设置系统时间
-w, --systohc 从当前系统时间设置硬件时钟
--systz 基于当前时区设置系统时间
--adjust 根据自上次时钟设置或调整后的系统漂移
来调整 RTC
-c, --compare 定期将系统时钟与 CMOS 时钟相比较
--getepoch 打印内核的硬件时钟纪元(epoch)值
--setepoch 将内核的硬件时钟纪元(epoch)值设置为
--epoch 选项指定的值
--predict 预测 --date 选项所指定时刻读取到的 RTC 值
-V, --version 显示版本信息并退出
选项:
-u, --utc 硬件时钟保持为 UTC 时间
--localtime 硬件时钟保持为本地时间
-f, --rtc <文件> 代替默认文件的特殊 /dev/... 文件
--directisa 直接访问 ISA 总线,而非 /dev/rtc
--badyear 忽略 RTC 年份(由于 BIOS 损坏)
--date <时间> 指定要设置的硬件时钟时间
--epoch <年> 指定作为硬件纪元(epoch)值起始的年份
--noadjfile 不访问 /etc/adjtime;需要使用 --utc 或 --localtime 选项
--adjfile <文件> 指定调整文件的路径;
默认为 /etc/adjtime
--test 不更新,只显示将进行什么操作
-D, --debug 调试模式
看着一堆眼花缭乱的参数,凌乱了没有呢? 其实没这么复杂,我们只需要记住几个常用的场景即可:
案例一 :查看当前硬件日期和时间
[root@itlaoxin41 ~]# hwclock
2023年02月21日 星期二 09时02分41秒 -0.366432 秒
案例二: 将系统时间设置到硬件时间,设置硬件时区为本地时区
[root@itlaoxin41 ~]# hwclock --localtime --systohc
案例三: 以系统时间更新硬件时间
[root@itlaoxin41 ~]# hwclock -w
如果反过来,也可以设置以硬件时间更新系统时间,这时候需要使用 -s
[root@itlaoxin41 ~]# hwclock -s
命令二:date的那些事
在时间家族里,总是少不了date,你知道吗,在英语里date有海枣的意思,当一个女孩子跟你说想要date的时候,你可不能真带一把海枣给她哦,因为date还有约会的意思呢。
女孩子说: “我只是想约会,结果你却给了我一把海枣!”
linux中的date命令 : 用于 显示 或 设置系统的时间或日期。
常见的日期格式如下表:
日期格式 | 解释 |
---|---|
%t | 输出制表符,tab键 |
%H | 小时(00~23) |
%I | 小时(00~12) |
%M | 分钟(00~59) |
%S | 秒(00~59) |
%j | 今年中的第几天 |
%Y | 输出年份 |
%m | 输出月份 |
%d | 输出日期 |
又是一个让人眼花缭乱的命令,一起看看案例吧:
案例一: 直接输出当前的时间
[root@itlaoxin41 ~]# date
2023年 02月 21日 星期二 09:19:01 CST
案例二: 输出 2023-02-21的格式时间输出当天时间
[root@itlaoxin41 ~]# date +"%Y-%m-%d"
2023-02-21
案例三: 输出日期加时间的格式,包含分时秒
[root@itlaoxin41 ~]# date +'%Y/%m/%d %H:%M:%S'
2023/02/21 09:21:24
怎么样不难吧,别急还有参数呢:
参数 | 解释 |
---|---|
-d | 指定时间运算规则,date会将当前时间做指定的运算,然后输出运算后的时间 |
-f | 可将-d参数指定的运算规则写入文件中,通过-f参数指定文件路径,date命令逐行读取该文件,并按照此文件指定的运算规则输出运算后的时间。 |
-r | 显示指定文件最后被修改的时间。 |
-s | 根据-s指定的内容设定系统的时间。执行此命令需要提权 |
案例四: 使用 -d参数进行运算
[root@itlaoxin41 ~]# date -d '3 minutes'
2023年 02月 21日 星期二 09:28:58 CST
[root@itlaoxin41 ~]# date -d '3 days'
2023年 02月 24日 星期五 09:26:09 CST
[root@itlaoxin41 ~]# date
2023年 02月 21日 星期二 09:26:11 CST
[root@itlaoxin41 ~]# date -d '-3 minutes'
2023年 02月 21日 星期二 09:23:21 CST
[root@itlaoxin41 ~]#
案例五: 计算1970年距今的秒数
date +%s
//从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数(时间戳)
[root@itlaoxin41 ~]# date +%s
1676942841
二. 时间命令在脚本中的应用
2.1 用date命令实现统计执行时间的脚本
在脚本中有时候我们想统计一组命令的执行花费的时间,就需要用到date命令来判断
脚本思路:
- 先计算命令执行前距离1970的秒数并赋值给start变量
- 执行命令
- 执行完后再次统计当前距离1970年产生的秒数并赋值给end
- 然后对start和end做运算,计算两者的差值。
- 之后打印这个差值,这个差值就是命令花费的时间
我们来看一个最简单的脚本,统计一条命令的时间:
root@itlaoxin41 ~]# vim ti.sh
[root@itlaoxin41 ~]# chmod +x ti.sh
[root@itlaoxin41 ~]# ./ti.sh
命令执行花费的时间为:9 seconds
[root@itlaoxin41 ~]# cat ti.sh
#!/bin/bash
# 先统计1970年距今的秒数
start=$(date +%s)
# 执行命令
ping -c10 -w10 www.baidu.com &>/dev/null
# 记录下来执行完成后1970距今的秒数
end=$(date +%s)
# 做运算
diff=$((end - start))
#得到结果
echo " 命令执行花费的时间为:$diff seconds"
看上去很完美,但实际上误差很大,因为执行命令也需要时间。
2.2 time命令
在统计某个程序运行耗时的时候,我们经常会用到time,这里面就包含了用户态和系统态的cpu耗时。
比如上个脚本中的ping命令
[root@itlaoxin41 ~]# time ping -c10 -w10 www.badu.com
PING www.badu.com (47.254.33.193) 56(84) bytes of data.
64 bytes from 47.254.33.193 (47.254.33.193): icmp_seq=1 ttl=45 time=210 ms
64 bytes from 47.254.33.193 (47.254.33.193): icmp_seq=2 ttl=45 time=210 ms
64 bytes from 47.254.33.193 (47.254.33.193): icmp_seq=3 ttl=45 time=209 ms
64 bytes from 47.254.33.193 (47.254.33.193): icmp_seq=4 ttl=45 time=211 ms
64 bytes from 47.254.33.193 (47.254.33.193): icmp_seq=5 ttl=45 time=211 ms
64 bytes from 47.254.33.193 (47.254.33.193): icmp_seq=6 ttl=45 time=209 ms
64 bytes from 47.254.33.193 (47.254.33.193): icmp_seq=7 ttl=45 time=209 ms
64 bytes from 47.254.33.193 (47.254.33.193): icmp_seq=8 ttl=45 time=210 ms
64 bytes from 47.254.33.193 (47.254.33.193): icmp_seq=9 ttl=45 time=212 ms
64 bytes from 47.254.33.193 (47.254.33.193): icmp_seq=10 ttl=45 time=210 ms
--- www.badu.com ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9017ms
rtt min/avg/max/mdev = 209.579/210.600/212.038/0.803 ms
real 0m9.236s
user 0m0.000s
sys 0m0.006s
[root@itlaoxin41 ~]#
这里有三个时间:
- real 表示命令运行结束时的时钟差
- user 运行时间不包含阻塞
- sys 系统态代码运行时间
一般情况下:单核情况下 real > user +sys , 而多核情况下 real <user + sys [存在多个CPU ]
我们再案例一统计的时间和real的时间类似,就是命令开始时候看一下时间,命令结束时候看一下时间的时间差。
3. sleep命令
这个命令看似与时间无关,但当我们要实现每隔几秒钟运行的时候,还是非常有用的。
比如:
sleep 1 睡眠1秒
sleep 1s 睡眠1秒
sleep 1m 睡眠1分
sleep 1h 睡眠1小时
比如一个日志切割脚本中,就可以使用sleep:
#!/bin/bash
LOGS_PATH=/home/www.itlaoxin.com
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
#按天切割日志
mv $LOGS_PATH/access.log $LOGS_PATH/www.itlaoxin.com_$YESTERDAY.log
#向 nginx 主进程发送 USR1 信号,重新打开日志文件,否则会继续往mv后的文件写内容,导致切割失败.
kill -USR1 `ps axu | grep "nginx: master process" | grep -v grep | awk 'print $2'`
#休眠10秒
sleep 10s
#压缩
gzip -9 $LOGS_PATH/itlaoxin.com_$YESTERDAY.log
#删除7天前的日志
cd $LOGS_PATH
find . -mtime +15 -name "*20[1-9][0-9]*" | xargs rm -f
exit 0
总结
以上就是关于shell中关于时间处理的全部内容了,喜欢的小伙伴记得点赞收藏哦。
✨ 原创不易,还希望各位大佬支持一下 \\textcolorblue原创不易,还希望各位大佬支持一下 原创不易,还希望各位大佬支持一下
👍 点赞,你的认可是我创作的动力! \\textcolorgreen点赞,你的认可是我创作的动力! 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向! \\textcolorgreen收藏,你的青睐是我努力的方向! 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富! \\textcolorgreen评论,你的意见是我进步的财富! 评论,你的意见是我进步的财富!
以上是关于shell脚本中那些关于时间的处理方案,你都掌握了吗?的主要内容,如果未能解决你的问题,请参考以下文章