《Advanced Bash-scripting Guide》学习(一):对一个增强和广义的删除logfile的脚本的理解
来源:互联网 发布:监控设备搜索软件 编辑:程序博客网 时间:2024/05/18 02:53
本文所选的例子来自于《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的脚本的理解
- 《Advanced Bash-scripting Guide》学习(三):自删除脚本和自读取内容的脚本
- 《Advanced Bash-scripting Guide》学习(四):一个显示时间日期登录用户的脚本
- 《Advanced Bash-scripting Guide》学习(十一):shift的用法
- 《Advanced Bash-scripting Guide》学习(二):测试脚本调用的参数是否正确
- Advanced Bash-Scripting Guide 学习笔记一
- 《Advanced Bash-scripting Guide》学习(九):备份最后一天所有修改的文件
- 《Advanced Bash-scripting Guide》学习(十三):引用变量的两个例子
- 《Advanced Bash-scripting Guide》学习(七):描述、列表和确定是否可以安装一个rpm包
- Advanced Bash-Scripting Guide:
- Advanced Bash-Scripting Guide
- Advanced Bash-Scripting Guide
- 《Advanced Bash-scripting Guide》学习(五):检查一个可执行文件是否存在
- 《Advanced Bash-scripting Guide》学习(十四):HERE Document和cat <<EOF
- Advanced Bash-Scripting Guide中译版
- Advanced Bash-Scripting Guide 读书笔记
- 《Advanced Bash-scripting Guide》学习(八):从一个目录移动整个目录树到另一个目录
- 《Advanced Bash-scripting Guide》学习(六):从/etc/fstab中读行
- Mysql的join(连接查询)
- HDU 4300 Clairewd’s message (KMP的nex数组应用)
- 2017.6.20 MFC菜单命令及响应顺序
- [Android]Splash界面解决启动白屏/黑屏问题
- 时间控件Mydate97的使用
- 《Advanced Bash-scripting Guide》学习(一):对一个增强和广义的删除logfile的脚本的理解
- css3设置文本阴影的属性
- 机器学习公开课-笔记1
- PAT乙级真题及训练集(12)--1028. 人口普查(20)
- Effective Modern C++: Item 10 -> 优先选择scoped enums而不是unscoped enums
- 总结几个问题啦
- LeetCode606:Construct String from Binary Tree
- 3GPP 资源 使用、查找 教程
- make clean