shell脚本中那些关于时间的处理方案,你都掌握了吗?

news2024/12/26 2:39:14

文章目录

  • 前言
  • 一. linux中关于时间的命令有哪些?
    • 1.1 命令一: hwclock
    • 命令二:date的那些事
  • 二. 时间命令在脚本中的应用
    • 2.1 用date命令实现统计执行时间的脚本
    • 2.2 time命令
    • 3. sleep命令
  • 总结

前言

大家好,我是互联网老辛,专注云原生领域的终身学习者,期待与你一起成长。

🏠个人主页:[互联网老辛](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中关于时间处理的全部内容了,喜欢的小伙伴记得点赞收藏哦。

原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} 原创不易,还希望各位大佬支持一下

👍 点赞,你的认可是我创作的动力! \textcolor{green}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向! \textcolor{green}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富! \textcolor{green}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/360658.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Css]Grid属性简单陈列(适合开发时有基础的快速过一眼)

[css进阶]Grid属性简介 文章目录[css进阶]Grid属性简介典型需求网格容器的属性displaygrid-template-columns和grid-template-rowsgrid-template-areasgrid-templategrid-column-gap grid-row-gapgrid-gapjustify-itemsalign-itemsjustify-contentalign-contentgrid-auto-colum…

【面试题】ES6 如何将 Set 转化为数组

大厂面试题分享 面试题库后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#xff1a;前端面试题库Set 是 ES6 中新增的一种集合类型&#xff0c;类似于数组&#xff0c;但其成员的值是唯一的&#xff0c;即不会重复。关于Set&#xff0c;可以阅…

Leaf说明

什么是Leafleaf是叶子的意思我们使用的Leaf是美团公司开源的一个分布式序列号(id)生成系统我们可以在Github网站上下载项目直接使用为什么需要Leaf上面的图片中是一个实际开发中常见的读写分离的数据库部署格式专门进行数据更新(写)的有两个数据库节点它们同时新增数据可能产生…

ThinkPHP5篮球培训报名系统

有需要请私信或看评论链接哦 可远程调试 ThinkPHP5篮球培训报名系统一 介绍 此篮球培训报名系统基于ThinkPHP5框架开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。用户可注册登录&#xff0c;充值&#xff0c;报名&#xff0c;反馈信息等&…

手摸手快速入门 正则表达式 (Vue源码中的使用)

vue2源码 在 vue2 源码的 src\compiler\parser\html-parser.js 文件中 里面有大量的正则表达式&#xff0c;如下图 可以看到非常的长&#xff0c;不是我说&#xff0c;就前几行&#xff0c;如果没有相关的 正则表达式 的工具&#xff0c;我可能就被劝退了&#x1f62d; 这里…

反沙箱CobaltStrike木马加载器分析

前言 近日&#xff0c;笔者参加了浙江护网&#xff0c;在攻击队停止攻击的那一天凌晨&#xff0c;Windows服务器被攻破大量失分&#xff0c;早晨溯源时拿到了这一份名为chrome.exe的木马样本。 木马HASH SHA256:7fbe93d7c29b4ea4ce918f3d16a74d2930120f44d00862bdc0a1f82899…

ubuntu server系统树莓派安装mysql8.0开启远程访问

文章目录前言博客一、安装mysql8.0二、创建一个远程访问的新用户三、在MySQL配置文件中启用远程访问。四、navicat15连接mysql8.0返回10061chatgpt回复前言 百度了半天没解决&#xff0c;问了下chatgpt成功解决了…… 博客 一、安装mysql8.0 确认MySQL 8.0服务器已安装并正在…

【ESP32-S3】Pycharm 使用 microPython 教程(避坑)

一、下载Pycharm等操作 1.百度云下载链接 链接&#xff1a;https://pan.baidu.com/s/1tkbMzS5B_v-Cn4WQlTqS3Q?pwd0108 提取码&#xff1a;0108 2.安装 按照压缩包中的教程来&#xff0c;你懂的。 二、配置microPython环境 1.安装 microPython 插件 1.1 File > Sett…

【云原生】k8s之Yaml文件详解

一、K8S支持的文件格式 kubernetes支持YAML和JSON文件格式管理资源对象。 JSON格式&#xff1a;主要用于api接口之间消息的传递YAML格式&#xff1a;用于配置和管理&#xff0c;YAML是一种简洁的非标记性语言&#xff0c;内容格式人性化&#xff0c;较易读 1、yaml和json的主…

企业级信息系统开发学习笔记1.5 初探Spring AOP

文章目录零、本讲学习目标一、Spring AOP&#xff08;一&#xff09;AOP基本含义&#xff08;二&#xff09;AOP基本作用&#xff08;三&#xff09;AOP与OOP对比&#xff08;四&#xff09;AOP使用方式&#xff08;五&#xff09;AOP基本概念二、提出游吟诗人唱赞歌任务&#…

手把手教你做插件(2)模块大串联

0&#xff0c;前言 这篇文章笔记比较简略&#xff0c;大部分的操作都是和上一篇文章重复了&#xff0c;建议先看上一节文章&#xff0c;直达电梯&#xff1a;UE4 手把手教你做插件&#xff08;1&#xff09; 从代码引用插件_asiwxy的博客-CSDN博客UE4 手把手教你创建插件https:…

Windows10神州网信政府版麦克风、摄像头的使用

Windows10神州网信政府版默认麦克风摄像头是禁用状态&#xff0c;此禁用状态符合版本规定。 在录课和直播过程中&#xff0c;如果需要使用麦克风和摄像头的功能&#xff0c;可以这样更改&#xff1a; 1、鼠标右键点击屏幕左下角的开始菜单图标&#xff0c;选择windows中的“运…

[6/101] 101次软件测试面试之经典面试题剖析

01、自我介绍答&#xff1a;大家好&#xff0c;我是一名软件测试工程师&#xff0c;但我更喜欢称自己为“软件bug捕手”。我相信&#xff0c;软件测试工程师的使命就是让软件更加健壮、更加可靠、更加美好。我们就像是一群“特警”&#xff0c;在黑暗的代码中寻找漏洞和缺陷&am…

spring boot——自定义依赖实现自动配置

需求 要实现的功能是&#xff1a;实现一个可以支持miniooss两种方式&#xff0c;上传下载文件的自定义依赖。其中还包括一些创建桶、删除桶、删除文件等功能&#xff0c;但是最主要的是实现自动配置。 如果对spring理解很深的话&#xff0c;自动配置这些东西很容易理解&#…

php获取api接口数据的方法

API是应用程序的开发接口&#xff0c;在开发程序的时候&#xff0c;我们有些功能可能不需要从到到位去研发&#xff0c;我们可以拿现有的开发出来的功能模块来使用&#xff0c;而这个功能模块&#xff0c;就叫做库(libary)。比如说&#xff1a;要实现数据传输的安全&#xff0c…

传输层TCP与UDP协议

目录 传输层 传输层功能 传输层所提供的服务 传输层的两个协议 TCP协议与UDP协议 端口 端口分类 IP地址和端口的关系 UDP协议 前言&#xff1a; UDP报文格式 检验和的伪首部 伪首部内容 TCP协议 TCP报文格式 TCP协议数据段的理解 TCP的伪首部 伪首部内容 标…

基于Jeecgboot前后端分离的ERP系统开发系列--出库单(3)

继续对销售出库单进行完善与处理 一、列表显示状态 目前先给出库表单两种状态&#xff0c;未审核与审核通过状态&#xff0c;前端通过下面调整 { title:状态, align:"center", dataIndex: status, customRender:f…

Netty(四):优化与源码

文章目录1. 优化1.1 扩展序列化算法1.2 参数调优1&#xff09;CONNECT_TIMEOUT_MILLIS2&#xff09;SO_BACKLOG3&#xff09;ulimit -n4&#xff09;TCP_NODELAY5&#xff09;SO_SNDBUF & SO_RCVBUF6&#xff09;ALLOCATOR7&#xff09;RCVBUF_ALLOCATOR1.3 RPC 框架1&…

IDEA性能优化设置(解决卡顿问题)修改内存

在我们日常使用IDEA进行开发时&#xff0c;可能会遇到许多卡顿的瞬间&#xff0c;明明我们的机器配置也不低啊&#xff1f;为什么就会一直卡顿呢&#xff1f; 原来这是因为IDEA软件在我们安装的时候就设置了默认的内存使用上限&#xff08;通常很小&#xff09;&#xff0c;这就…

理解IM消息“可靠性”和“一致性”问题,以及解决方案探讨

试想如果一个IM连发出的消息都不知道对方到底能不能收到、发出的聊天内容对方看到的到底是不是“胡言乱语”&#xff08;严重乱序问题&#xff09;&#xff0c;这样的APP用户肯定不会让他在手机上过夜&#xff08;肯定第一时间卸载了&#xff09;&#xff0c;因为最基本的聊天逻…