1. du
-a:递归地输出指定目录或多个目录中所有文件的统计结果
-h:以KB、MB或块(block)为单位显示磁盘使用情况
-c:显示磁盘使用总计
-s:只输出合计数据(summarize)
–exclude:从磁盘使用统计中排除部分文件
–exclude-from:从文件中获取需要排除的文件列表
–max-depth:指定du应该遍历的目录层次的最大深度
# du -ak /root | sort -nrk 1 | head -n 10 #找到指定目录/root中最大的10个文件
2. time command
# time ls -d /root /root real 0m0.003s user 0m0.000s sys 0m0.000s
real时间指的是挂钟时间(wall clock time),也就是命令从开始执行到结束的时间。这段时间包括其他进程所占用的时间片(time slice)以及进程被阻塞时所花费的时间
user时间指的是进程花费在用户模式(user-mode)中的CPU时间。这是唯一真正用于执行进程所花费的世界。执行其他进程以及话费在阻塞状态中德时间并没有计算在内
sys时间是指进程花费在内核模式(in the kernel)中德CPU时间。它代表在内核中执行系统调用所使用的世界,这和库代码(library
code)不同,后者仍旧运行在用户空间(user space)。与“user世界”类似,这也是真正由进程使用的CPU时间
time命令的可执行二进制文件位于/usr/bin/time,还有一个Shell内建命令也叫做time,当运行time时,默认调用的
Shell的内建命令,Shell内建的time命令选项有限。因此,如果我们需要使用另外的功能,就应该使用可执行文件time的绝对路径(/usr
/bin/time)。
time其他参数
-o:将命令执行时间写入文件
-a:追加到文件(append)
-f:利用格式化字符串格式化时间输出
real: %e
user: %U
sys: %S
# /usr/bin/time -f “Time: %U” -a -o timing.log uname
3. 打印出10条最常使用的命令
cat /root/.bash_history | awk ‘{ list[$1]++ } END { for(i in list) {printf(“%s\t%d\n”,i,list[i]);}}’ | sort -nrk 2 | head
将历史命令通过管道将源输入传递给awk。在awk中,使用一个关联数组。这个数组将命令名作为索引,将命令出现的次数作为数组元素值。命令每出现一次,
计数值增加1(list[$1]++)。$1是输入文本行的第一个单词。如果是用$0,则包含输入文本行中的所有单词。sort -nrk
2对第2列(count)按照数值逆向排序
4. 列出1小时内占用CPU最多的10个进程
#!/bin/bash #Name: pcpu_usage.sh #Description: Script to calculate cpu usage by processes for 1 hour SECS=3600 #Change the SECS to custom seconds STEPS=$(( $SECS / 60 )) echo Watching CPU usage... ; logfile=/tmp/cpu_usage.$ for((i=0;i<STEPS;i++)) do ps -eo comm,pcpu,pid | sort -k2nr |head -30 >> $logfile # sleep 60 done echo echo CPU eaters : awk '{ process[$1 FS $3]+=$2; } END{ for(i in process) print i, process[i] }' $logfile | sort -k2nr | head | cut -d" " -f1
5. watch动态监控命令输出
-n:后面更时间(秒),每多少秒更新一次输出
-d:将时间间隔前后的命令输出差异以不同颜色突出标示出来
6. inotify
inotifywait -m -r -e create,move,delete
-m:表明要持续监视变化,而不是在事件发生之后退出
-r:允许采用递归形式监视目录
-q:用于减少冗余信息,只打印出所需要的信息
-e:指定需要监视的事件列表
事件 描述
access 读取文件
modify 文件内容被修改
attrib 文件元数据被修改
move 对文件进行移动操作
create 生成新文件
open 对文件进行打开操作
close 对文件进行关闭操作
delete 文件被删除
7. logrotate
missingok 如果日志文件丢失,则忽略;然后返回(不对日志系统进行轮替)
notifempty 仅当源日志文件非空时才对其进行轮替
size 30k 限制实施轮替的日志文件大小。可以用1M表示1MB
compress 允许用gzip对较旧的日志进行压缩
weekly 指定进行轮替的世界间隔。可以是weekly,yearly或daily
rotate 5 这是需要保留的旧日志文件的归档数量,以1.gz、2.gz…5.gz结尾
create 066 root root 指定所要创建的归档文件的模式、用户以及用户组
更多参数服务logrotate的手册:http://linux.die.net/man/8/logrotate
8. 通过监视用户登录找出入侵者
#!/bin/bash #Filename: intruder_detect.sh #Description: Intruder reporting tool with secure input AUTHLOG=/var/log/secure if [[ -n $1 ]]; then AUTHLOG=$1 echo Using Log file : $AUTHLOG fi LOG=/tmp/valid.$$.log grep -v "invalid" $AUTHLOG > $LOG users=$(grep "Failed password" $LOG | awk '{ print $(NF-5) }' | sort | uniq) printf "%-5s|%-10s|%-10s|%-13s|%-33s|%s\n" "Sr#" "User" "Attempts" "IP address" "Host_Mapping" "Time range" ucount=0; ip_list="$(egrep -o "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" $LOG | sort | uniq)" for ip in $ip_list; do grep $ip $LOG > /tmp/temp.$$.log for user in $users; do grep $user /tmp/temp.$$.log> /tmp/$$.log cut -c-16 /tmp/$$.log > $$.time tstart=$(head -1 $$.time); start=$(date -d "$tstart" "+%s"); tend=$(tail -1 $$.time); end=$(date -d "$tend" "+%s") limit=$(( $end - $start )) if [ $limit -gt 120 ]; then let ucount++; IP=$(egrep -o "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" /tmp/$$.log | head -1 ); TIME_RANGE="$tstart-->$tend" ATTEMPTS=$(cat /tmp/$$.log|wc -l); HOST=$(host $IP | awk '{ print $NF }' ) printf "%-5s|%-10s|%-10s|%-10s|%-33s|%-s\n" "$ucount" "$user" "$ATTEMPTS" "$IP" "$HOST" "$TIME_RANGE"; fi done done
Mon Jan 21 11:56:27 CST 2013