本文所选的例子来自于《Advanced Bash-scripting Gudie》一书,译者 杨春敏 黄毅

cleanup:一个增强和广义的删除logfile的脚本

#!/bin/bash
#清除,版本3

LOG_DIR=/var/log   
ROOT_UID=0      #当UID为0的时候,用户才具有root用户的权限
LINES=50           #默认的保存行数
E_XCD=66          #不在/var/log目录下,将以error退出
E_NOTROOT=67    #非root用户将以error退出
E_WRONGARGS=65  #非数值的保留行数将以error退出

#检查是否为root用户,非root用户不能执行此脚本,将以error退出
if [ "$UID" -ne "$ROOT_UID" ]
then
        echo "Must be root to run this script."
        exit $E_NOTROOT
fi

#检查命令行参数
case "$1" in
"" )
        lines=$LINES
        ;;
*[!0-9]* )
        echo "Usage: `basename $0` file-cleanup"
        exit $E_WRONGARGS
        ;;
* )
        lines=$1
        ;;
esac

1.此处的usage是用法的意思

2.`basename $0`执行basename命令,$0为当前脚本的名字,因此`basename $0`是显示当前脚本的名字,如我的脚本名字叫cleanup.sh,那么$(`basename $0)="cleanup.sh"

注:在linux中可用man basename查看basename的用法:

如下图例子中:

#basename /usr/bin/sort

sort   #输出结果

为basename指定一个路径,basename命令会删除所有的前缀(包括最后一个'/')

#basename include/stdio.h .h

stdio  #输出结果

如果后缀被指定为.h, basename命令会将所有前缀以及指定的后缀去除掉

#检查当前目录是否正确,如果不在/var/log的目录下,将退出
if [ "$PWD" != "$LOG_DIR" ]
then
        echo "Can't change to $LOG_DIR."
        exit $E_XCD
fi

#进行到这一步,开始清除logfile
tail -$lines messages > mesg.temp       #保存messages文件的最后部分
mv mesg.temp messages                      #变为新的messages文件
cat /dev/null > wtmp                            #清除wtmp文件

1.有必要解释一下这两个文件messages和wtmp

/var/log/messages的作用:
/var/log/messages文件中存放的是系统的日志信息,当内核程序调试时,printk语句所产生的信息显示不出来的时候,就使用cat /var/log/messages文件的方法,查看所打印出的信息.

/var/log/wtmp的作用:
/var/log/wtmp是一个二进制文件,记录每次用户的登录次数和持续时间等信息
  该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件。因此随着系统正常运行时间的增加,该文件的大小也会越来越大,增加的速度取决于系统用户登录的次数。该日志文件可以用来查看用户的登录记录。
查看方法:
last或last -f /var/log/wtmp   (-f 指定记录文件)

2.cat /dev/null > wtmp只是清空wtmp文件的内容,文件还是存在的./dev/null相当于一个黑洞或垃圾箱,只要执行,就不会保存任何文件.还有一种方法是本书提到的 : > wtmp, :和>
(重定向操作符)结合使用时,把一个文件截断到0长度,没有修改它的权限.
如果文件在之前并不存在,那么就创建它.

#文件清除完,返回一个表示成功的退出码0
echo "Logs cleaned up."
exit 0

关于退回码表示的意义

exit n
n为退出码,退出码的约定
0表示成功(Zero - Success)
非0表示失败(Non-Zero  - Failure)
2表示用法不当(Incorrect Usage)
65表示非数值( data format error )
127表示命令没有找到(Command Not Found)
126表示不是可执行的(Not an executable)
>=128 信号产生

脚本执行结果

case1:非root用户

由于我的shell脚本放在/root/sh下,所以切换成普通用户执行/root/sh/cleanup.sh时.提示我权限不够

两种办法:1.我用sudo尝试,不能成功,提示该普通用户不再sudoers中

2.切换到root用户,把脚本拷贝到/tmp下,再切回普通用户执行,得到的结果和预期相同,系统会提示:Must be root to run this script.

case 2:当前路径不在/var/log下

如果没有在其下,系统会提示:Can't change to /var/log.

case3:检查命令行参数(三种状态:为空、非数值、数值型)

为空时默认保留50行

为非数值系统会提示:Usage:cleanup.sh file-cleanup

为数值时会按照所给数值保留相应的行数

《Advanced Bash-scripting Guide》学习(一):对一个增强和广义的删除logfile的脚本的理解的更多相关文章

  1. advanced bash shell guide读书笔记

    http://note.youdao.com/noteshare?id=fc23a679849b4627d131d3ef07c74a71

  2. advanced dom scripting dynamic web design techniques Part One DOM SCRIPTING IN DETAIL CHAPTER 1 DO IT RIGHT WITH BEST PRACTICES

    You’re excited; your client is excited. All is well. You’ve just launched the client’s latest websit ...

  3. 《DOM Scripting》学习笔记-——第三章 DOM

    <Dom Scripting>学习笔记 第三章 DOM 本章内容: 1.节点的概念. 2.四个DOM方法:getElementById, getElementsByTagName, get ...

  4. 《DOM Scripting》学习笔记-——第二章 js语法

    <Dom Scripting>学习笔记 第二章 Javascript语法 本章内容: 1.语句. 2.变量和数组. 3.运算符. 4.条件语句和循环语句. 5.函数和对象. 语句(stat ...

  5. [转帖][Bash Shell] Shell学习笔记

    [Bash Shell] Shell学习笔记 http://www.cnblogs.com/maybe2030/p/5022595.html  阅读目录 编译型语言 解释型语言 5.1 作为可执行程序 ...

  6. Spring学习之第一个AOP程序

    IOC和AOP是Spring的两大基石,AOP(面向方面编程),也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP). 在进行 OOP 开发时,都是基于对 ...

  7. ASP.NET MVC Web API 学习笔记---第一个Web API程序

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...

  8. swift学习:第一个swift程序

    原文:swift学习:第一个swift程序 最近swift有点火,赶紧跟上学习.于是,个人第一个swift程序诞生了... 新建项目

  9. SHELL脚本学习-练习写一个脚本4

    #编写一个脚本时,自动生成”#!/bin/bash”这一行和相关注释信息. 把以下的代码保存为一个sh文件,比如test.sh , 新建脚本是使用  bash test.sh newfile 即可. ...

随机推荐

  1. Linux学习笔记(10)linux网络管理与配置之一——主机名与IP地址,DNS解析与本地hosts解析(1-4)

    Linux学习笔记(10)linux网络管理与配置之一——主机名与IP地址,DNS解析与本地hosts解析 大纲目录 0.常用linux基础网络命令 1.配置主机名 2.配置网卡信息与IP地址 3.配 ...

  2. keras中 LSTM 的 [samples, time_steps, features] 最终解释

    I am going through the following blog on LSTM neural network:http://machinelearningmastery.com/under ...

  3. VIM 配置python

    Pre-install sudo yum install automake gcc gcc-c++ kernel-devel cmake sudo yum install python-devel p ...

  4. Part01、memcache 缓存

    Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy 目录 一. Memcached Memcached安装和基本使用 Python操作Memcached2.1 se ...

  5. MySQL 数据备份,Pymysql模块(Day47)

    阅读目录 一.IDE工具介绍 二.MySQL数据备份 三.Pymysql模块 一.IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https:/ ...

  6. for迭代序列的三种方式

    while循环是条件性的,for循环是迭代性的. for循环会访问所有迭代对象中的所有元素,并在所有条目都结束后结束循环. for循环迭代序列有三种基本的方式,分别是通过序列项迭代.通过索引迭代.通过 ...

  7. 113. Path Sum II(求等于某个数的所有路径)

    Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...

  8. iOS XCode工程 警告处理

    今天 老板说,群~你的警告⚠️蛮多的...我拍了胸脯,下周项目总结时候一定会完美解决!!! 于是我得把项目中全部警告解决了,加油

  9. gh-ost原理

    gh-ost原理 一.三种模式架构图 1.连上从库,在主库上修改 这是gh-ost默认的工作模式,它会查看从库情况,找到集群的主库并且连接上去,对主库侵入最少,大体步骤是: 在主库上创建_xxx_gh ...

  10. CF961G Partitions(第二类斯特林数)

    题目 CF961G 前置 斯特林数\(\Longrightarrow\)斯特林数及反演总结 做法 相信大家能得出一个一眼式:\[Ans=\sum\limits_{i=1}^n w_i\sum\limi ...