《LinuxShell腳本攻略》,Chap-8:當(dāng)個(gè)好管家
簡(jiǎn)介
操作系統(tǒng)(Operation System,OS),是由一系列用于不同目的、服務(wù)于不同任務(wù)的系統(tǒng)軟件組成。
日志記錄(logging)和監(jiān)視是很重要的,能幫助我們從大量數(shù)據(jù)中收集信息。
監(jiān)視系統(tǒng)活動(dòng)的各種命令,日志技術(shù)及其使用方法。
統(tǒng)計(jì)磁盤使用情況
磁盤空間是一種有限資源,我們需要了解磁盤的可用空間。
df, du, fdisk是Linux中的磁盤管理三板斧
df(disk free): 報(bào)告文件系統(tǒng)磁盤空間的使用情況;
du(disk usage): 報(bào)告磁盤空間使用情況; 使用du時(shí),要確保對(duì)其遍歷的目錄和文件擁有適合的讀權(quán)限。
fdisk: Linux分區(qū)表操作工具軟件。
du file1 #默認(rèn)以字節(jié)為單位
#-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,從磁盤統(tǒng)計(jì)中排除部分文件
du --exclude="*.swap" -sh /home/zhang
#--max-depth,指定最大遍歷深度
du -h --max-depth n /dir
du -h --max-depth=2 /home/zhang
#-x,將/mnt中所有掛載點(diǎn)排除在磁盤統(tǒng)計(jì)之外
du -xh /dir
#找出目錄中最大的文件
du -ak /dir | sort -nrk 1 | head -n 5
#此輸出包含了目錄大小,需要細(xì)化
#利用find替du過(guò)濾文件
find /dir -type f --exec du -ak {} \; | sort -nrk 1 | head
#df,磁盤可用空間信息
df -h
計(jì)算命令執(zhí)行時(shí)間
當(dāng)測(cè)試一個(gè)應(yīng)用程序或比較不同的算法時(shí),程序的執(zhí)行時(shí)間非常重要。所以需要計(jì)算命令執(zhí)行時(shí)間。
所有的Unix-Like操作系統(tǒng)都包含time命令,可將time放在需要計(jì)算執(zhí)行時(shí)間的命令前。
time命令有個(gè)可執(zhí)行二進(jìn)制文件位于/usr/bin/time,還有一個(gè)shell built-in命令也叫作time;
當(dāng)運(yùn)行time時(shí),默認(rèn)調(diào)用的是shell built-in命令。內(nèi)建time命令選項(xiàng)有限;
因此,如果我們需要使用另外的功能,就應(yīng)該使用/usr/bin/time命令。
#計(jì)算命令執(zhí)行時(shí)間
time command
time ls
#real,掛鐘時(shí)間(wall clock time),命令從開(kāi)始執(zhí)行到結(jié)束的時(shí)間;
#user,指進(jìn)程花費(fèi)在用戶模式(user-mode)中的CPU時(shí)間。這是唯一用于執(zhí)行進(jìn)程所花費(fèi)的時(shí)間;
#sys,指進(jìn)程花費(fèi)在內(nèi)核模式(in the kernel)中的CPU時(shí)間。它代表在內(nèi)核中執(zhí)行系統(tǒng)調(diào)用所使用的時(shí)間。
#-o,將命令執(zhí)行時(shí)間寫入文件
/usr/bin/time -o exetime.txt ls /
#-a,不影響原文件
/usr/bin/time -a -o exetime.txt ls /home
#-f,格式化時(shí)間輸出
#時(shí)間格式字符串
#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
當(dāng)前登錄用戶、啟動(dòng)日志、啟動(dòng)故障的相關(guān)信息
收集與操作系統(tǒng)、當(dāng)前登錄用戶、主機(jī)運(yùn)行時(shí)間、啟動(dòng)故障等相關(guān)信息很有用處。
#獲取當(dāng)前登錄用戶
who #顯示已經(jīng)登錄的用戶
w #顯示已經(jīng)登錄的用戶以及他們?cè)谧鍪裁?#會(huì)顯示用戶使用的偽終端(pseudo TTY),對(duì)應(yīng)設(shè)備文件出現(xiàn)在/dev/pts/n
#列出登錄主機(jī)的用戶列表
users
#查看系統(tǒng)運(yùn)行時(shí)間
uptime
#顯示用戶登錄列表
last
#獲取某個(gè)用戶登錄信息
last zhang
#獲取重啟會(huì)話信息
last reboot
#獲取失敗的用戶登錄信息
lastb
打印10條最常使用的命令
終端是用來(lái)訪問(wèn)shell的工具,在shell中我們可以輸入并執(zhí)行命令。我們可以找出在shell中運(yùn)行最多的命令。
~/.bash_history,默認(rèn)保留1000個(gè)最近執(zhí)行命令?;蛘?code>history命令。
cat .bash_history | sort -n | uniq -c | sorn -nr | head
列出占用CPU最多的進(jìn)程
CPU時(shí)間是一項(xiàng)重要資源,有時(shí)需要跟蹤占用CPU周期最多的進(jìn)程。
對(duì)于需要處理大量請(qǐng)求的服務(wù)器來(lái)說(shuō),CPU是極其重要的資源。通過(guò)監(jiān)視某個(gè)時(shí)期內(nèi)CPU的使用情況,可以找出長(zhǎng)期占用CPU的進(jìn)程并對(duì)其進(jìn)行優(yōu)化,或是調(diào)試其他問(wèn)題。
用ps命令收集系統(tǒng)中進(jìn)程的詳細(xì)信息。
ps - report a snapshot of the current processes
#-e,以標(biāo)準(zhǔn)語(yǔ)法顯示每個(gè)進(jìn)程
ps -e
ps -ef
#ax,以BSD語(yǔ)法顯示每個(gè)進(jìn)程
ps ax
pa axu
#獲取安全信息
#ps -eo euser,ruser,suser,fuser,f,comm,pcpu,label
#comm顯示命令,pcpu顯示CPU使用率
ps -eo comm,pcpu
#監(jiān)視并計(jì)算一小時(shí)內(nèi)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行開(kāi)始輸出。上面輸出第一行是 COMAND 和 %CPU
#$1,command; $2,%CPU
#process[$1]是一個(gè)關(guān)聯(lián)函數(shù),相當(dāng)于arr[command]
#arr[command]=arr[command]+ $2,計(jì)算同一命令的累積時(shí)間
#i指命令,process[i]指命令運(yùn)行時(shí)間
用watch監(jiān)視命令輸出
可能需要在在某段時(shí)期內(nèi)以固定的間隔時(shí)間不短監(jiān)視某個(gè)命令的輸出??衫?code>watch命令。
watch - execute a program periodically, showing output fullscreen
#watch命令可以用來(lái)在終端以固定的間隔監(jiān)視命令輸出,默認(rèn)2秒間隔
watch command
watch 'command'
watch ls
watch 'ls -l'
#-n,指定時(shí)間間隔
watch -n 5 'yum update -y'
#-d,突出(highlighting)watch輸出中的差異
watch -d -n 1'dd if=/dev/zero of=/tmp/zero.test'
對(duì)文件及目錄訪問(wèn)進(jìn)行記錄
記錄重要文件及目錄訪問(wèn),對(duì)于追蹤文件和目錄的變化很有幫助。
inotifywait命令可以用來(lái)收集有關(guān)文件訪問(wèn)的信息。
inotifywait和rsync用戶實(shí)時(shí)同步哦!
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檢測(cè),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系統(tǒng)維護(hù)中必不可少的組成部分。日志文件可以幫助跟蹤系統(tǒng)中多種服務(wù)所發(fā)生的事件,這有助于排除系統(tǒng)問(wèn)題。
但隨著時(shí)間推移,日志文件會(huì)變得越來(lái)越大。因而必須對(duì)日志文件進(jìn)行管理。
我們可以利用一種稱為“輪詢(rotation)”的技術(shù)來(lái)限制日志文件的體積。一旦日志文件超過(guò)了限定大小,就要對(duì)它的內(nèi)容進(jìn)行抽取(strip),同時(shí)將日志文件的舊條目歸檔到文件中。
logratate是每一位Linux系統(tǒng)管理員都應(yīng)該了解的命令。它能夠?qū)⑷罩疚募蟠笮∠拗圃诮o定的SIZE內(nèi)。
logrotate配置文件位于/etc/logrotate.d
logrotate ‐ rotates, compresses, and mails system logs
vim /etc/logrotated.d/custom
/var/log/custom.log {
missingok #日志文件丟失,則忽略
notifempty #僅當(dāng)源日志文件非空時(shí)才進(jìn)行輪替
size 30k #限制實(shí)施輪替的日志文件大小
compress #壓縮舊日志
weekly #輪詢時(shí)間,daily,weekly,yearly
rotate 7 #保留舊日志數(shù)量
create 0600 root root #創(chuàng)建的日志文件模式,用戶和用戶組
#還有一些其他選項(xiàng)
}
用sys記錄日志
在Linux系統(tǒng)中,在/var/log中創(chuàng)建并寫入日志信息的是由被稱為syslog的協(xié)議處理的。它由守護(hù)進(jìn)程syslogd負(fù)責(zé)執(zhí)行。
每一個(gè)標(biāo)準(zhǔn)應(yīng)用進(jìn)程都可以用syslog記錄日志信息。
syslog處理/var/log下的多個(gè)日志文件。但是當(dāng)logger發(fā)送消息時(shí),它用標(biāo)記字符串來(lái)確定應(yīng)該紀(jì)錄到哪一個(gè)日志文件中。
syslogd使用與日志相關(guān)聯(lián)的TAG來(lái)決定應(yīng)該將其記錄到哪一個(gè)文件中。
可以從/etc/rsyslog.d/目錄的配置文件中看到與日志文件相關(guān)聯(lián)的標(biāo)記字符串。
Linux中一些重要日志文件:
/var/log/boot.log, 系統(tǒng)啟動(dòng)信息;
/var/log/message, 內(nèi)核啟動(dòng)信息;
/var/log/auth.log, 用戶認(rèn)證日志;
/var/log/dmesg, 系統(tǒng)啟動(dòng)信息;
/var/log/mail.log, 郵件服務(wù)器日志。
logger - a shell command interface to the syslog
#logger命令,默認(rèn)記錄日志信息到/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"