目录

  • 概述:
  • 背景:
  • 需求:
  • 需求分析
  • 需求实现:
  • 实现功能:
  • 使用示例:
  • 开发的坑:
    • 1、不能把watch命令写到cputemp.sh脚本里面
    • 2、单引号内引用变量需要嵌套单引号
  • 总结:

概述:

本文主要讲述的是一个关于记录shell脚本执行日志的日志脚本函数。

背景:

本人在做shell脚本开发的过程中,常常要运行脚本来监测一些系统数据,但是我又没有很多时间来一直盯着命令控制台看,所以我就想能不能把这些脚本运行的情况记录成一个日志并保存下来,方便我有时间的时候查看。

需求:

1、可以记录脚本的运行情况;
2、可以记录时间;
3、可以在输入log达到一定的行数后对以前的log进行删减,防止log文件无限累积;

需求分析

需求很简单,想想看好像有很多方式可以实现,最终结合个人喜好和技术能力,选择编写一个运行在shell脚本里面的函数;这个函数的作用是将shell脚本中需要输出的日志信息,输出成与脚本同名的log文本,记录在系统中,方便开发人员在空闲时间进行查阅,分析脚本的运行情况。

需求实现:

经过三天三夜的奋战,写出了以下脚本函数:

#!/bin/bash
log(){#log文件名local fileName="./$(basename $0 .sh).log"#log文件最大存储log行数(此处设置最大存储log行数是100行)local fileMaxLen=100#超过log最大存储行数后需要从顶部开始删除的行数(此处设置的是删除第1到第10行的数据)local fileDeleteLen=10if test $fileNamethen#记录logecho "[`date +%y/%m/%d-%H:%M:%S`]:$*" >> $fileName#获取log文件实际行数loglen=`grep -c "" $fileName`if [ $loglen -gt $fileMaxLen ]then#从顶部开始删除对应行数的logsed -i '1,'$fileDeleteLen'd' $fileNamefielseecho "[`date +%y/%m/%d-%H:%M:%S`]:$*" > $fileNamefi
}#test
testdate=100
#记录输出的字符串
log "test string"
#记录输出的数据
log "testdate=$testdate"
#记录输出的运算
log $[1+2]
#记录命令输出的信息
log $(printf "this is cmd test %s\n" "this is cmd output string")

其中主要的就是log()这个脚本函数,'#test’之后的都是对这个函数的测试;

实现功能:

1、可以快速的加入到当前的脚本中,加入方法:将log()函数复制到在当前的脚本的最前面,然后后面对需要记录的日志直接调用log就可以;
2、加入需要记录日志的脚本后,执行脚本时,会在执行脚本同目录下生成一个同名的.log文件,里面就是执行脚本的日志输出;
3、可以记录脚本运行时间及可对字符串、数据变量、及命令输出的信息进行记录;
4、可以对log文件的行数进行判断,当行数超过最大限制行数后,会从log文件顶部开始删除以前的log记录。

使用示例:

比如要实时查看CPU的温度,就有如下脚本(cputemp.sh):

#!/bin/bash
echo CPU temperature is $[`cat /sys/class/thermal/thermal_zone0/temp`/1000]

在命令控制台使用watch命令可以做到实时监控

watch -n 1 ./cputemp.sh

执行结果如下:
这样是可以实现实时查看,可是为了数据的延续性,所以我加上了log脚本函数,修改了cputemp.sh脚本,如下:

#!/bin/bash
log(){#log文件名local fileName="./$(basename $0 .sh).log"#log文件最大存储log行数(此处设置最大存储log行数是100行)local fileMaxLen=100#超过log最大存储行数后需要从顶部开始删除的行数(此处设置的是删除第1到第10行的数据)local fileDeleteLen=10if test $fileNamethen#记录logecho "[`date +%y/%m/%d-%H:%M:%S`]:$*" >> $fileName#获取log文件实际行数loglen=`grep -c "" $fileName`if [ $loglen -gt $fileMaxLen ]then#从顶部开始删除对应行数的logsed -i '1,'$fileDeleteLen'd' $fileNamefielseecho "[`date +%y/%m/%d-%H:%M:%S`]:$*" > $fileNamefi
}echo CPU temperature is $[`cat /sys/class/thermal/thermal_zone0/temp`/1000]
log $(echo CPU temperature is $[`cat /sys/class/thermal/thermal_zone0/temp`/1000])

使用watch命令循环执行

watch -n 1 ./cputemp.sh

执行在命令控制台的结果和之前是一样的,但是现在在同一个文件目录下会生成一个cputemp.log的文件,查看该文件可以发现CPU的温度信息已记录。
使用cat命令查看cputemp.log

 cat ./cputemp.log

得到文件内容,如下

从图中可以看出CPU温度在40-41之间波动。

开发的坑:

1、不能把watch命令写到cputemp.sh脚本里面

这中间还是有一点不完善的地方是,不能把watch命令写到cputemp.sh脚本里面是比较麻烦的,如果把watch命令写到cputemp.sh脚本里面,就会出现执行的温度信息被固定成一个固定值,不能做到实时查看。
如下:
修改的脚本:

#!/bin/bash
watch -n 1 echo CPU temperature is $[`cat /sys/class/thermal/thermal_zone0/temp`/1000]

执行:

./cputemp.sh

执行结果:
从执行结果中可以看到

$[`cat /sys/class/thermal/thermal_zone0/temp`/1000]

被固定成了40,导致每秒循环只是打印

CPU temperature is 40

而不能达到效果,所以目前只能用命令调用脚本的方式了。

2、单引号内引用变量需要嵌套单引号

在使用 sed 命令时用到了单引号(‘’),单引号内需要引用变量时,需要对引用变量嵌套单引号,不然会报错。

sed -i '1,'$fileDeleteLen'd' $fileName

总结:

目前这种实现方式也满足了基本需求。虽然有瑕疵,但勉强也能用。

免责声明:本文内容含网络参考、作者编写等,内容版权归原作者所有,未经允许,禁止转载。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。

Linux学习笔记-shell脚本-log脚本函数相关推荐

  1. linux脚本执行过程中被挂起,Linux学习笔记(八)——脚本执行的过程控制

    一.脚本执行过程中的控制 之前的内容中,运行编写好的脚本时都是在命令行上直接确定运行的,并且运行的脚本是实时的,这并不是脚本唯一的运行方式,下面的内容是脚本的其他运行方式.例如在Linux系统中如何控 ...

  2. linux中的echo%3e文件,Linux学习笔记-shell脚本中${}的使用方法

    ${} 除了做${var}变量替换,还有什么功能呢? # 举例说明 [[email protected] ~]$ file=/dir1/dir2/dir3/my.file.txt # 变量替换 [[e ...

  3. 【Linux学习笔记④】——Shell程序设计【变量 输入与输出 条件表达式 判断语句 循环语句 Shell函数】

    ⌛️ 文章目录 一.Shell 概述 二.Shell 脚本的定义与执行 2.1 Shell 脚本的定义 2.2 Shell 脚本的执行 三.Shell 变量 3.1 用户自定义变量 3.2 环境变量 ...

  4. 史上最牛最强的linux学习笔记 10.shell基础

    史上最牛最强的linux学习笔记 10.shell基础 写在最前面: 本文是基于某站的视频学习所得,第一个链接如下: https://www.bilibili.com/video/BV1mW411i7 ...

  5. Linux学习之一键建站脚本

    本文转自lnmp.lamp.lnmpa一键安装包和LAMP一键安装脚本使用说明 这个脚本是使用shell编写,为了快速在生产环境上部署lnmp/lamp/lnmpa(Linux.Nginx/Tengi ...

  6. Polyworks脚本开发学习笔记(十七)-制作宏脚本自定义工具条

    Polyworks脚本开发学习笔记(十七)-制作宏脚本自定义工具条 做好的宏脚本程序,每次打开脚本加载程序太多麻烦,为了方便的调用脚本做各种操作,可以使用系统的自定义工具条功能将脚本加载到工具条上. ...

  7. linux给数据库重命名,Linux学习笔记:mv移动或文件重命名

    mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录. 语法:mv 源文件 目标文件 视mv命令中 ...

  8. LINUX学习笔记共五部分

    LINUX学习笔记1--LINUX系统命令 1.         界面切换: a)         进入字符界面:按住ctrl+alt+F1: 1.         首先需要进入用户登入,输入用户名和 ...

  9. Linux学习笔记10

    Linux学习笔记10 Linux学习笔记10 正则表达式 源码包约定目录 Shell脚本约定目录 Shell脚本的创建与执行 date命令 同步时间 Shell脚本预设变量 与用户交互 数学计算 S ...

  10. LINUX学习笔记:31个常用LINUX命令和相关解释

    LINUX学习笔记三: 最近在带新同事,是一个刚入行的萌新,对于linux不是很熟悉,问我怎么来学习. 所以今天接着之前的部分,继续分享一些linux学习资料.有需要的点点保存,没有跳过呗.PS:内容 ...

最新文章

  1. gridContro使用随记
  2. 生成批量缩率图_Windows系统实战之:批量生成某类型文件
  3. 30分钟 带你浅入requirejs源码
  4. 洛谷 P3539 [POI2012]ROZ-Fibonacci Representation 解题报告
  5. Cadence 建立封装:多个引脚于芯片内部连接的封装建立方式
  6. lucene索引合并与增量索引
  7. CentOS安装setup
  8. PHP - PDO 之 mysql 基础操作
  9. 通过听力写代码?盲人程序员就是这样做的
  10. php中的thumb函数,phpcms v9 thumb(缩略图) 函数说明
  11. 基于zookeeper实现分布式配置中心(一)
  12. 关于浏览器的兼容性问题
  13. 内存泄露之常见问题解决「初级篇」
  14. 深入浅出WPF之我件2
  15. 利用Python将PDF转化为图片的方法
  16. html怎么设置p元素居中,CSS 如何使p层水平居中
  17. 科研心态那些事-不积跬步无以至千里
  18. python 球的表面积和体积_[给球的体积算表面积]C语言求球的表面积和体积
  19. ζ(2)的夹逼代数证明
  20. Pr中有音频轨道,但是播放不了声音

热门文章

  1. 导出Excel:合并单元格
  2. 面向初学者的 Python IDE:Thonny,你值得一试
  3. 计算器软件设计和计算机软件设计区别,基于LabVIEW的计算器程序设计
  4. 微信企业转账到银行卡
  5. 【避坑指“难”】react-dnd引入后,.mjs文件解析错误
  6. Java筑基10-封装继承多态(重点)
  7. 七牛上传视频获取视频封面和缩略图
  8. 李春江:决赛是期待和希望,希望小丁早日康复
  9. 在Unity顶部显示手机状态栏(iOS/Android)
  10. [渝粤教育] 西南科技大学 英语(A)1 在线考试复习资料