一. 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命令 : 用于 显示 或 设置系统的时间或日期。
常见的日期格式如下表:
又是一个让人眼花缭乱的命令,一起看看案例吧:
案例一: 直接输出当前的时间
[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
怎么样不难吧,别急还有参数呢:
案例四: 使用 -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中关于时间处理的全部内容了,喜欢的小伙伴记得点赞收藏哦。