zoukankan      html  css  js  c++  java
  • 《Advanced Bash-scripting Guide》学习(一):对一个增强和广义的删除logfile的脚本的理解

    本文所选的例子来自于《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

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




  • 相关阅读:
    _proto_和prototype的区别
    ajax
    图片预加载
    loading动画
    WinSCP
    检测竖屏 横屏
    webstrom hbuilder快捷键
    vue 引入sass
    npm install -save 和 -save-dev 区别
    打乱数组顺序
  • 原文地址:https://www.cnblogs.com/my_captain/p/7147656.html
Copyright © 2011-2022 走看看