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脚本中那些关于时间的处理方案,你都掌握了吗?的主要内容,如果未能解决你的问题,请参考以下文章

关于print你知道多少?print的用法你都掌握了吗?

关于日期和时间的那些事,过来看看你都能搞对吗?

linux文本处理三剑客之sed,原来只需要掌握这些!!!

linux文本处理三剑客之sed,原来只需要掌握这些!!!

linux生产文本处理掌握这些就够了:awk,gawk,sed,grep,sort

linux生产文本处理掌握这些就够了:awk,gawk,sed,grep,sort