linux中关于时间的常用命令有哪些?(时间命令在shell脚本中的应用)

一. linux中关于时间的命令有哪些?

作为一个技术人,提到时间,或许你第一时间想到的就是代码中与时间处理相关的bug,或者关于闰年,时区的处理,着实让人头疼。

今天我们就不聊这些让人头疼的事情了,而是一起来看看在linux系统中那些好玩的命令和脚本。

你还记得有哪些吗?

1.1 命令一: hwclock

当我们要查看与设置当前的BIOS时间的是哪个命令?

是的,就是那个 hwclock命令,我们用–help查看以下帮助:

[root@bunian ~]# 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@bunian ~]# hwclock 
2023年03月29日 星期二 11时49分41秒  -0.366432 秒
案例二: 将系统时间设置到硬件时间,设置硬件时区为本地时区
[root@bunian ~]# hwclock --localtime --systohc
案例三: 以系统时间更新硬件时间
[root@bunian ~]# hwclock -w

如果反过来,也可以设置以硬件时间更新系统时间,这时候需要使用 -s

[root@bunian ~]# hwclock -s

命令二:date的那些事

在时间家族里,总是少不了date,你知道吗,在英语里date有海枣的意思,当一个女孩子跟你说想要date的时候,你可不能真带一把海枣给她哦,因为date还有约会的意思呢。

女孩子说: “我只是想约会,结果你却给了我一把海枣!”

linux中的date命令 : 用于 显示 或 设置系统的时间或日期。

常见的日期格式如下表:

图片[1]-linux中关于时间的常用命令有哪些?(时间命令在shell脚本中的应用)-不念博客

又是一个让人眼花缭乱的命令,一起看看案例吧:

案例一: 直接输出当前的时间
[root@bunian ~]# date
2023年 03月 29日 星期二 11:49:01 CST

案例二: 输出 2023-03-29的格式时间输出当天时间
[root@bunian ~]# date +"%Y-%m-%d"
2023-03-29
案例三: 输出日期加时间的格式,包含分时秒
[root@bunian ~]# date +'%Y/%m/%d %H:%M:%S'
2023/03/29 11:49:24

怎么样不难吧,别急还有参数呢:

图片[2]-linux中关于时间的常用命令有哪些?(时间命令在shell脚本中的应用)-不念博客
案例四: 使用 -d参数进行运算
[root@bunian ~]# date -d '3 minutes'
2023年 03月 29日 星期二 11:28:58 CST
[root@bunian ~]# date -d '3 days'
2023年 04月 01日 星期六 11:26:09 CST
[root@bunian ~]# date
2023年 03月 29日 星期二 11:26:11 CST
[root@bunian ~]# date -d '-3 minutes'
2023年 03月 29日 星期二 11:23:21 CST
案例五: 计算1970年距今的秒数

date +%s
//从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数(时间戳)

[root@bunian ~]# date +%s
1676942841

二. 时间命令在脚本中的应用

2.1 用date命令实现统计执行时间的脚本

在脚本中有时候我们想统计一组命令的执行花费的时间,就需要用到date命令来判断

脚本思路:

  • 先计算命令执行前距离1970的秒数并赋值给start变量
  • 执行命令
  • 执行完后再次统计当前距离1970年产生的秒数并赋值给end
  • 然后对start和end做运算,计算两者的差值。
  • 之后打印这个差值,这个差值就是命令花费的时间

我们来看一个最简单的脚本,统计一条命令的时间:

root@bunian ~]# vim ti.sh
[root@bunian ~]# chmod +x ti.sh 
[root@bunian ~]# ./ti.sh 
 命令执行花费的时间为:9 seconds
[root@bunian ~]# 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

这里有三个时间:

  • 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.bunian.cn
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
#按天切割日志
mv ${LOGS_PATH}/access.log ${LOGS_PATH}/www.bunian.cn_${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}/bunian.cn_${YESTERDAY}.log
#删除7天前的日志
cd ${LOGS_PATH}
find . -mtime +15 -name "*20[1-9][0-9]*" | xargs rm -f
exit 0

总结

以上就是关于shell中关于时间处理的全部内容了,喜欢的小伙伴记得点赞收藏哦。

© 版权声明
THE END