《LinuxShell脚本攻略》,Chap-8:当个好管家
简介
操作系统(Operation System,OS),是由一系列用于不同目的、服务于不同任务的系统软件组成。
日志记录(logging)和监视是很重要的,能帮助我们从大量数据中收集信息。
监视系统活动的各种命令,日志技术及其使用方法。
统计磁盘使用情况
磁盘空间是一种有限资源,我们需要了解磁盘的可用空间。
df
, du
, fdisk
是Linux中的磁盘管理三板斧
df
(disk free): 报告文件系统磁盘空间的使用情况;
du
(disk usage): 报告磁盘空间使用情况; 使用du
时,要确保对其遍历的目录和文件拥有适合的读权限。
fdisk
: Linux分区表操作工具软件。
du file1 #默认以字节为单位
#-a,显示目录下所有文件大小
du -a /home/zhang
du /home/zhang #只显示目录大小
#-h,以可读形式打印
du -h /home/zhang
#-c,显示使用总量
du -c file1 /dir2
du -c *.txt *.sh
#-s,打印摘要
du -s /dir
du -sh /home/zhang
#-b,-k,-m,-B,用特定单位打印
du -k file1
du -m file2
#--exclude,从磁盘统计中排除部分文件
du --exclude="*.swap" -sh /home/zhang
#--max-depth,指定最大遍历深度
du -h --max-depth n /dir
du -h --max-depth=2 /home/zhang
#-x,将/mnt中所有挂载点排除在磁盘统计之外
du -xh /dir
#找出目录中最大的文件
du -ak /dir | sort -nrk 1 | head -n 5
#此输出包含了目录大小,需要细化
#利用find替du过滤文件
find /dir -type f --exec du -ak {} \; | sort -nrk 1 | head
#df,磁盘可用空间信息
df -h
计算命令执行时间
当测试一个应用程序或比较不同的算法时,程序的执行时间非常重要。所以需要计算命令执行时间。
所有的Unix-Like操作系统都包含time命令,可将time放在需要计算执行时间的命令前。
time命令有个可执行二进制文件位于/usr/bin/time,还有一个shell built-in命令也叫作time;
当运行time时,默认调用的是shell built-in命令。內建time命令选项有限;
因此,如果我们需要使用另外的功能,就应该使用/usr/bin/time命令。
#计算命令执行时间
time command
time ls
#real,挂钟时间(wall clock time),命令从开始执行到结束的时间;
#user,指进程花费在用户模式(user-mode)中的CPU时间。这是唯一用于执行进程所花费的时间;
#sys,指进程花费在内核模式(in the kernel)中的CPU时间。它代表在内核中执行系统调用所使用的时间。
#-o,将命令执行时间写入文件
/usr/bin/time -o exetime.txt ls /
#-a,不影响原文件
/usr/bin/time -a -o exetime.txt ls /home
#-f,格式化时间输出
#时间格式字符串
#real %e
#user %U
#sys %S
/usr/bin/time -f "FORMAT STRING" command
/usr/bin/time -f "Rtme: %e" -a -o timing.log uname
/usr/bin/time -f "Rtime: %e\nUtime: %U\nStime: %S" -ao timing.log uname
当前登录用户、启动日志、启动故障的相关信息
收集与操作系统、当前登录用户、主机运行时间、启动故障等相关信息很有用处。
#获取当前登录用户
who #显示已经登录的用户
w #显示已经登录的用户以及他们在做什么
#会显示用户使用的伪终端(pseudo TTY),对应设备文件出现在/dev/pts/n
#列出登录主机的用户列表
users
#查看系统运行时间
uptime
#显示用户登录列表
last
#获取某个用户登录信息
last zhang
#获取重启会话信息
last reboot
#获取失败的用户登录信息
lastb
打印10条最常使用的命令
终端是用来访问shell的工具,在shell中我们可以输入并执行命令。我们可以找出在shell中运行最多的命令。
~/.bash_history,默认保留1000个最近执行命令。或者history
命令。
cat .bash_history | sort -n | uniq -c | sorn -nr | head
列出占用CPU最多的进程
CPU时间是一项重要资源,有时需要跟踪占用CPU周期最多的进程。
对于需要处理大量请求的服务器来说,CPU是极其重要的资源。通过监视某个时期内CPU的使用情况,可以找出长期占用CPU的进程并对其进行优化,或是调试其他问题。
用ps
命令收集系统中进程的详细信息。
ps - report a snapshot of the current processes
#-e,以标准语法显示每个进程
ps -e
ps -ef
#ax,以BSD语法显示每个进程
ps ax
pa axu
#获取安全信息
#ps -eo euser,ruser,suser,fuser,f,comm,pcpu,label
#comm显示命令,pcpu显示CPU使用率
ps -eo comm,pcpu
#监视并计算一小时内CPU使用情况的shell脚本
secs=3600
unit_time=60
steps=$(($secs / $unit_time))
echo "Whatching CPU usage..."
for((i=0; i<steps; i++))
do
ps -eo comm,pcpu | tail -n +2 >> /tmp/cpu_usage.$$
sleep $unit_time
done
echo "CPU eaters: "
cat /tmp/cpu_usage.$$ | \
awk '{process[$1]+=$2}
END{
for (i in process) {
printf("%-20s %s",i,process[i]);
}
}' | sort -nrk 2 | head
#tail -n +K,从第K行开始输出。上面输出第一行是 COMAND 和 %CPU
#$1,command; $2,%CPU
#process[$1]是一个关联函数,相当于arr[command]
#arr[command]=arr[command]+ $2,计算同一命令的累积时间
#i指命令,process[i]指命令运行时间
用watch监视命令输出
可能需要在在某段时期内以固定的间隔时间不短监视某个命令的输出。可利用watch
命令。
watch - execute a program periodically, showing output fullscreen
#watch命令可以用来在终端以固定的间隔监视命令输出,默认2秒间隔
watch command
watch 'command'
watch ls
watch 'ls -l'
#-n,指定时间间隔
watch -n 5 'yum update -y'
#-d,突出(highlighting)watch输出中的差异
watch -d -n 1'dd if=/dev/zero of=/tmp/zero.test'
对文件及目录访问进行记录
记录重要文件及目录访问,对于追踪文件和目录的变化很有帮助。
inotifywait
命令可以用来收集有关文件访问的信息。
inotifywait
和rsync
用户实时同步哦!
inotifywait - wait for changes to files using inotify
yum install -y inotify-tools
#-q,减少冗余信息
inotifywait -m -r -q -e create,move,delete /dir
inotifywait -m -r -q -e create,move,modify,delete /home/zhang >> inotifywait.log
#利用inotifywait检测,rsync同步
inotifywait -mrq -e create,move,modify,delete /dir --exclude="*.swap" | while read file
do
rsync -avz --exclude="*.swap" --delete /dir user@host:PATH > /dev/null 2>&1
done
用logrotate管理日志文件
日志文件是Linux系统维护中必不可少的组成部分。日志文件可以帮助跟踪系统中多种服务所发生的事件,这有助于排除系统问题。
但随着时间推移,日志文件会变得越来越大。因而必须对日志文件进行管理。
我们可以利用一种称为“轮询(rotation)”的技术来限制日志文件的体积。一旦日志文件超过了限定大小,就要对它的内容进行抽取(strip),同时将日志文件的旧条目归档到文件中。
logratate
是每一位Linux系统管理员都应该了解的命令。它能够将日志文件大大小限制在给定的SIZE内。
logrotate配置文件位于/etc/logrotate.d
logrotate ‐ rotates, compresses, and mails system logs
vim /etc/logrotated.d/custom
/var/log/custom.log {
missingok #日志文件丢失,则忽略
notifempty #仅当源日志文件非空时才进行轮替
size 30k #限制实施轮替的日志文件大小
compress #压缩旧日志
weekly #轮询时间,daily,weekly,yearly
rotate 7 #保留旧日志数量
create 0600 root root #创建的日志文件模式,用户和用户组
#还有一些其他选项
}
用sys记录日志
在Linux系统中,在/var/log中创建并写入日志信息的是由被称为syslog的协议处理的。它由守护进程syslogd负责执行。
每一个标准应用进程都可以用syslog记录日志信息。
syslog处理/var/log下的多个日志文件。但是当logger发送消息时,它用标记字符串来确定应该纪录到哪一个日志文件中。
syslogd使用与日志相关联的TAG来决定应该将其记录到哪一个文件中。
可以从/etc/rsyslog.d/
目录的配置文件中看到与日志文件相关联的标记字符串。
Linux中一些重要日志文件:
/var/log/boot.log, 系统启动信息;
/var/log/message, 内核启动信息;
/var/log/auth.log, 用户认证日志;
/var/log/dmesg, 系统启动信息;
/var/log/mail.log, 邮件服务器日志。
logger - a shell command interface to the syslog
#logger命令,默认记录日志信息到/var/log/messages
logger "test log message to messages"
tail -n 1 /var/log/message
#-t,指定特定TAG
logger -t TAG "test log message to messages"