Linux基礎(chǔ)命令介紹九:進(jìn)程與內(nèi)存
計(jì)算機(jī)存在的目的就是為了運(yùn)行各種各樣的程序,迄今我們介紹的絕大多數(shù)命令,都是為了完成某種計(jì)算而用編程語言編寫的程序,它們以文件的形式保存在操作系統(tǒng)之中(比如/bin下的各種命令);但靜態(tài)的程序并不能“自發(fā)的”產(chǎn)生結(jié)果,只有在操作系統(tǒng)中為其指定輸入數(shù)據(jù)并運(yùn)行起來,才能得到輸出結(jié)果。而操作系統(tǒng)中程序運(yùn)行的最主要表現(xiàn)形式便是進(jìn)程。
靜態(tài)程序可以長久的存在,動(dòng)態(tài)的進(jìn)程具有有限的生命周期。每次程序運(yùn)行的開始(如鍵入一條命令后按下回車鍵),操作系統(tǒng)都要為程序的運(yùn)行準(zhǔn)備各種資源,這些資源絕大多數(shù)都處于內(nèi)存之中。為了限制多用戶進(jìn)程的權(quán)限,linux還定義了兩種進(jìn)程運(yùn)行時(shí)態(tài):內(nèi)核態(tài)和用戶態(tài);當(dāng)進(jìn)程想要請求系統(tǒng)服務(wù)時(shí)(比如操作一個(gè)物理設(shè)備),必須通過系統(tǒng)調(diào)用(操作系統(tǒng)提供給用戶空間的接口函數(shù))來實(shí)現(xiàn),此時(shí)系統(tǒng)切換到內(nèi)核態(tài),代表程序執(zhí)行該系統(tǒng)調(diào)用,執(zhí)行完畢后系統(tǒng)切換回用戶態(tài),繼續(xù)執(zhí)行程序代碼。
本文介紹linux中關(guān)于進(jìn)程與內(nèi)存的管理命令(更多的是查看命令)
1、uptime 系統(tǒng)運(yùn)行時(shí)間
- uptime [options]
單獨(dú)執(zhí)行此命令時(shí),輸出信息表示:當(dāng)前時(shí)間,系統(tǒng)運(yùn)行時(shí)長,登錄用戶個(gè)數(shù),系統(tǒng)過去1、5、15分鐘內(nèi)的平均負(fù)載。
- [root@centos7 ~]# uptime
- 10:46:38 up 58 days, 19:20, 3 users, load average: 0.00, 0.01, 0.05
2、ps 顯示系統(tǒng)進(jìn)程信息
- ps [options]
單獨(dú)運(yùn)行ps命令時(shí)顯示信息為:進(jìn)程ID號(PID)、終端(TTY)、運(yùn)行累積CPU時(shí)長(TIME)、命令名(CMD)
- [root@centos7 ~]# ps
- PID TTY TIME CMD
- 9503 pts/1 00:00:00 bash
- 9570 pts/1 00:00:00 ps
這里簡要敘述一下關(guān)于進(jìn)程、進(jìn)程組、會(huì)話和終端的關(guān)系。linux操作系統(tǒng)為了方便管理進(jìn)程,將功能相近或存在父子、兄弟關(guān)系的進(jìn)程歸為一組,每個(gè)進(jìn)程必定屬于一個(gè)進(jìn)程組,也只能屬于一個(gè)進(jìn)程組。一個(gè)進(jìn)程除了有進(jìn)程ID外,還有一個(gè)進(jìn)程組ID(PGID);每個(gè)進(jìn)程組都有一個(gè)進(jìn)程組組長,它的PID和進(jìn)程組ID相同。像一系列相關(guān)進(jìn)程可以合并為進(jìn)程組一樣,一系列進(jìn)程組也可以合并成一個(gè)會(huì)話session。會(huì)話是由其中的進(jìn)程建立的,該進(jìn)程叫做會(huì)話的首進(jìn)程(session leader)。會(huì)話首進(jìn)程的PID即為此會(huì)話的SID(session ID)。每個(gè)會(huì)話都起始于用戶登錄,終止于用戶退出。會(huì)話中的每個(gè)進(jìn)程組稱為一個(gè)工作(job)。會(huì)話可以有一個(gè)進(jìn)程組成為會(huì)話的前臺工作(foreground),而其他的進(jìn)程組是后臺工作(background)。每個(gè)會(huì)話都關(guān)聯(lián)到一個(gè)控制終端control terminal,當(dāng)會(huì)話終止時(shí)(用戶退出終端),系統(tǒng)會(huì)發(fā)送終止信號(SIGHUP)給會(huì)話中的所有進(jìn)程組,進(jìn)程對此信號的默認(rèn)處理方式為終止進(jìn)程。
ps接受三種格式的選項(xiàng),帶前綴符號-的UNIX格式的選項(xiàng);不帶前綴的BSD風(fēng)格的選項(xiàng);帶兩個(gè)-的GNU長格式選項(xiàng)。三種類型的選項(xiàng)可以自由組合,但可能會(huì)出現(xiàn)沖突。
選項(xiàng)a(BSD)表示顯示所有和終端關(guān)聯(lián)的進(jìn)程信息,當(dāng)配合選項(xiàng)x(BSD)一起使用時(shí)表示顯示所有進(jìn)程信息(此時(shí)終端無關(guān)的進(jìn)程TTY列顯示為?)。
選項(xiàng)-a(UNIX)表示顯示與終端關(guān)聯(lián)的除了會(huì)話首進(jìn)程之外的進(jìn)程信息。選項(xiàng)-e表示所有進(jìn)程。
- [root@centos7 ~]# ps a
- PID TTY STAT TIME COMMAND
- 2528 tty1 Ss+ 0:00 -bash
- 9336 pts/0 Ss 0:00 -bash
- 9503 pts/1 Ss 0:00 -bash
- 9550 pts/2 Ss+ 0:00 -bash
- 9571 pts/0 S+ 0:00 man ps
- 9582 pts/0 S+ 0:00 less -s
- 9643 pts/1 R+ 0:00 ps a
- [root@centos7 ~]# ps -a
- PID TTY TIME CMD
- 9571 pts/0 00:00:00 man
- 9582 pts/0 00:00:00 less
- 9644 pts/1 00:00:00 ps
如例子中所示,BSD風(fēng)格的選項(xiàng)還會(huì)顯示進(jìn)程的狀態(tài)信息以及命令的參數(shù)。進(jìn)程在運(yùn)行的過程當(dāng)中可能處于的狀態(tài)包括:
- D 不可中斷的睡眠狀態(tài)(通常在等待IO)
- R 正在運(yùn)行或可以運(yùn)行(在運(yùn)行隊(duì)列中)
- S 可中斷的睡眠狀態(tài)(等待一個(gè)事件完成)
- T 暫停狀態(tài)
- t 跟蹤狀態(tài)
- W 換頁狀態(tài)(2.6內(nèi)核以后版本)
- X 死亡狀態(tài)(不可見)
- Z 僵死狀態(tài)
- #BSD風(fēng)格的選項(xiàng)STAT列還可能包括以下字符
- < 高優(yōu)先級進(jìn)程
- N 低優(yōu)先級進(jìn)程
- L 鎖定狀態(tài)
- s 會(huì)話首進(jìn)程
- l 多線程進(jìn)程
- + 進(jìn)程處于前臺進(jìn)程組
選項(xiàng)u顯示用戶導(dǎo)向的進(jìn)程信息(如進(jìn)程的發(fā)起用戶,用戶態(tài)占用CPU和MEM百分比等)
- [root@centos7 ~]# ps au
- USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
- root 2528 0.0 0.0 115636 2384 tty1 Ss+ 9月30 0:00 -bash
- root 9336 0.0 0.0 115596 2240 pts/0 Ss 08:44 0:00 -bash
- root 9571 0.0 0.0 119196 1972 pts/0 S+ 10:59 0:00 man ps
- root 9582 0.0 0.0 110276 980 pts/0 S+ 10:59 0:00 less -s
- root 9835 0.0 0.0 115636 2172 pts/1 Ss 13:48 0:00 -bash
- root 9938 0.0 0.0 115512 2096 pts/2 Ss 14:49 0:00 -bash
- root 9960 0.0 0.0 154068 5632 pts/2 S+ 14:50 0:00 vim others.sh
- root 9967 0.0 0.0 139496 1640 pts/1 R+ 14:59 0:00 ps au
VSZ表示占用的總的地址空間大小。它包括了沒有映射到內(nèi)存中的頁面。
RSS表示實(shí)際駐留"在內(nèi)存中"的內(nèi)存大小,不包括交換出去的內(nèi)存。和VSZ的單位均為KB
通常查看所有進(jìn)程信息會(huì)使用命令ps -ef或ps aux
選項(xiàng)-o或o表示指定輸出格式
如顯示所有bash進(jìn)程的pid,命令名,運(yùn)行于哪顆邏輯cpu:
- [root@centos7 ~]# ps -eo pid,comm,psr|grep bash
- 2528 bash 1
- 9336 bash 4
- 9835 bash 3
- 9938 bash 6
配合選項(xiàng)--sort可指定按某一列排序輸出
- #表示按用戶名排序
- ps -eo pid,user,args --sort user
還可以用-o指定許多其他信息,請查詢相關(guān)手冊。
3、kill 終止進(jìn)程
- kill [options] pid...
命令kill會(huì)發(fā)送特定的信號給指定的進(jìn)程或進(jìn)程組,如果沒有指定信號,則發(fā)送TERM信號
選項(xiàng)-l表示列出所有支持的信號:
- [root@centos7 ~]# kill -l
- 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
- 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
- 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
- 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
- 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
- 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
- 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
- 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
- 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
- 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
- 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
- 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
- 63) SIGRTMAX-1 64) SIGRTMAX
- [root@centos7 ~]#
可以使用選項(xiàng)-s指定要發(fā)送的信號
如在一個(gè)終端啟動(dòng)進(jìn)程sleep 300,在另一個(gè)終端查看并使用信號SIGKILL將其終止:
- [root@centos7 ~]# sleep 300
- #此時(shí)會(huì)一直等待sleep執(zhí)行完畢
- #在另一個(gè)終端中
- [root@centos7 temp]# ps -ef|grep [s]leep
- root 10359 9835 0 12:05 pts/1 00:00:00 sleep 300
- #發(fā)送信號
- [root@centos7 temp]# kill -s SIGKILL 10359
- #原終端顯示
- [root@centos7 ~]# sleep 300
- 已殺死
- [root@centos7 ~]#
或者執(zhí)行命令kill -9 10359是同樣的效果。關(guān)于其他信號的作用,請自行搜索。
4、pgrep和pkill 搜索或者發(fā)送信號給進(jìn)程
- pgrep [options] pattern
- pkill [options] pattern
這里的pattern是正則表達(dá)式,用來匹配進(jìn)程名
如查看名稱為gunicorn的所有進(jìn)程
- [root@centos7 ~]# pgrep gunicorn
- 17268
- 17286
- 17289
- 17290
- 17293
選項(xiàng)-l顯示進(jìn)程名和pid
- [root@centos7 ~]# pgrep -l gun
- 17268 gunicorn
- 17286 gunicorn
- 17289 gunicorn
- 17290 gunicorn
- 17293 gunicorn
如終止所有sleep進(jìn)程
- pkill sleep
如使syslogd重讀它的配置文件
- pkill -HUP syslogd
5、top 顯示進(jìn)程信息
top命令實(shí)時(shí)動(dòng)態(tài)的顯示系統(tǒng)匯總信息和進(jìn)程狀態(tài)信息,它每隔1s刷新一次,按鍵盤q鍵退出。
單獨(dú)執(zhí)行top命令時(shí)顯示如下輸出:
- top - 03:20:02 up 59 days, 17:30, 3 users, load average: 0.00, 0.01, 0.05
- Tasks: 184 total, 1 running, 183 sleeping, 0 stopped, 0 zombie
- %Cpu(s): 0.1 us, 0.0 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
- KiB Mem : 8010720 total, 5100308 free, 420652 used, 2489760 buff/cache
- KiB Swap: 8257532 total, 8257532 free, 0 used. 6905944 avail Mem
- PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
- 1 root 20 0 193664 8708 2396 S 0.0 0.1 1:23.98 systemd
- 2 root 20 0 0 0 0 S 0.0 0.0 0:00.44 kthreadd
- 3 root 20 0 0 0 0 S 0.0 0.0 0:00.10 ksoftirqd/0
- 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
- 7 root rt 0 0 0 0 S 0.0 0.0 0:00.34 migration/0
- 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
- 9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/0
- 10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/1
下面分別對每行輸出內(nèi)容進(jìn)行解釋(注:top版本為3.3.10,其他版本的輸出第四行和第五行可能不同)
***行顯示信息和命令uptime的輸出一致;
第二行顯示任務(wù)匯總信息,狀態(tài)即為進(jìn)程可能狀態(tài)中的四種;
第三行顯示cpu負(fù)載信息,其中us表示用戶態(tài)任務(wù)占用CPU時(shí)間百分比,sy表示內(nèi)核態(tài)任務(wù)占用CPU時(shí)間百分比,ni表示改變過進(jìn)程優(yōu)先級的進(jìn)程(通過nice或renice命令)占用CPU時(shí)間百分比,id表示CPU空閑時(shí)間百分比,wa表示等待輸入輸出的進(jìn)程占用CPU時(shí)間百分比,hi表示硬件中斷花費(fèi)時(shí)間,si表示軟件中斷花費(fèi)時(shí)間,st表示虛擬機(jī)等待真實(shí)物理機(jī)CPU資源的時(shí)間
第四行顯示內(nèi)存信息,total表示總內(nèi)存,free表示未分配內(nèi)存,used表示使用的內(nèi)存(值為total-free-buff/cache的結(jié)果),buff/cache表示緩存內(nèi)存;
第五行顯示交換分區(qū)使用量,其中avail Mem表示啟動(dòng)一個(gè)新程序時(shí)可以分配給它的***內(nèi)存,和第三行free列不同的地方在于,它會(huì)統(tǒng)計(jì)可以被回收的緩存分配器(slab)和頁高速緩沖存儲(chǔ)器(page cache)中的內(nèi)存。(在一些較早的top實(shí)現(xiàn)中,并沒有這一列的值)
接下來經(jīng)過一個(gè)空行之后,顯示的是進(jìn)程相關(guān)信息,表頭各列字段和ps命令的輸出均有相對應(yīng)的關(guān)系,其中PR表示優(yōu)先級;NI表示nice值(后述);VIRT表示虛擬內(nèi)存大小,對應(yīng)ps命令中的VSZ;RES表示進(jìn)程常駐內(nèi)存大小,對應(yīng)ps命令中的RSS;SHR表示共享內(nèi)存大小;S表示進(jìn)程狀態(tài),對應(yīng)ps命令的STAT;
linux系統(tǒng)的進(jìn)程狀態(tài)中有一個(gè)優(yōu)先級(priority)的概念,其值是一個(gè)動(dòng)態(tài)變化的整數(shù),范圍是0-139,此值越小,則優(yōu)先級越高,那么它就越優(yōu)先被CPU執(zhí)行。如果top命令PR列顯示為rt,表示此進(jìn)程為實(shí)時(shí)進(jìn)程,它的優(yōu)先級范圍是0-99,比其他的普通進(jìn)程都要高。linux中還有靜態(tài)優(yōu)先級的概念,用戶可以通過使用命令nice和renice對進(jìn)程設(shè)置或改變靜態(tài)優(yōu)先級,它可以看成是動(dòng)態(tài)優(yōu)先級的修正值,能夠影響動(dòng)態(tài)優(yōu)先級的值。
PR列顯示的值為實(shí)際優(yōu)先級減去實(shí)時(shí)進(jìn)程***優(yōu)先級之后的值,3.10內(nèi)核非實(shí)時(shí)進(jìn)程的默認(rèn)值為20,即:DEFAULT_PRIO = MAX_RT_PRIO + 20 = 120
NI列不為0時(shí),表示進(jìn)程被設(shè)置過靜態(tài)優(yōu)先級值,范圍是-20到19,它與當(dāng)前優(yōu)先級值的關(guān)系是:DEFAULT_PRIO = MAX_RT_PRIO + (nice) + 20
如使用nice啟動(dòng)一個(gè)sleep進(jìn)程:
- #當(dāng)不使用選項(xiàng)-n指定時(shí),默認(rèn)值為10
- [root@centos7 ~]# nice -n -10 sleep 300
- #對于已存在的進(jìn)程可以使用renice命令調(diào)整其靜態(tài)優(yōu)先級
- [root@centos7 ~]#
- [root@centos7 ~]# ps -eo pri,ni,comm|grep sleep
- 29 -10 sleep
- [root@centos7 ~]#
- [root@centos7 ~]# top -bn1 |egrep 'COMMAND$|sleep$'
- PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
- 11967 root 10 -10 107892 616 528 S 0.0 0.0 0:00.00 sleep
- #注意這里ps和top優(yōu)先級值顯示的不同,ps命令pri列的值 29 = MAX_PRIO(139) - MAX_RT_PRIO(100) + nice(-10)。它們實(shí)際的優(yōu)先級值是相等的。
上例中使用了選項(xiàng)-n表示top刷新次數(shù),-b表示批處理模式運(yùn)行top,此模式會(huì)去掉輸出中的控制字符,方便將輸出交給其他程序處理。
選項(xiàng)-o fieldname按指定列排序輸出,選項(xiàng)-O可以列出-o能夠指定的列名
- #自行執(zhí)行命令查看效果
- top -O |tr '\n' ' '
- top -bn1 -o PR
下面簡要介紹一些top中可以使用的交互命令:
- q 退出top
- h 獲得幫助信息
- 1 顯示每個(gè)邏輯cpu的信息
- k 終止一個(gè)進(jìn)程(會(huì)提示用戶輸入需要終止的pid,以及需要發(fā)送什么樣的信號)
- r 重新設(shè)置進(jìn)程靜態(tài)優(yōu)先級(相當(dāng)于執(zhí)行renice)
- i 忽略閑置和僵死進(jìn)程
- H 顯示線程信息
- M 根據(jù)駐留內(nèi)存大小排序
- P 根據(jù)CPU使用百分比排序
- W 將當(dāng)前設(shè)置寫入~/.toprc文件中
6、free 顯示系統(tǒng)內(nèi)存使用情況
- free [options]
free命令顯示系統(tǒng)當(dāng)前內(nèi)存、swap(交換分區(qū))的使用情況,默認(rèn)單位是KB
- #版本3.3.10
- [root@centos7 ~]# free
- total used free shared buff/cache available
- Mem: 8010720 423060 4540476 375580 3047184 6897052
- Swap: 8257532 0 8257532
顯示信息和top命令輸出中的對應(yīng)值一致,其中shared表示內(nèi)存文件系統(tǒng)(tmpfs)中使用內(nèi)存的大小。
前面講述了available對應(yīng)值所表示的含義,通常查看系統(tǒng)當(dāng)前還有多少可用內(nèi)存,看available的對應(yīng)值就可以了。這里available = free + 緩存(可被回收部分)。
但在較老版本的free中并沒有這個(gè)值,它的輸出可能是這樣的:
- total used free shared buffers cached
- Mem: 8174384 4120488 4053896 0 229320 1041712
- -/+ buffers/cache: 2849456 5324928
- Swap: 16779884 0 16779884
說明:
buffer(緩沖) 是為了提高內(nèi)存和硬盤(或其他I/O設(shè)備)之間的數(shù)據(jù)交換的速度而設(shè)計(jì)的
cache(緩存) 是為了提高cpu和內(nèi)存之間的數(shù)據(jù)交換速度而設(shè)計(jì)的
所以輸出中buffers可簡單理解為準(zhǔn)備寫入硬盤的緩沖數(shù)據(jù);cached可理解為從硬盤中讀出的緩存數(shù)據(jù)(頁高速緩沖存儲(chǔ)器),緩存中可被回收部分來自cached和slab(緩存分配器)
Mem行:used = total - free此時(shí)的空閑內(nèi)存free列并不能體現(xiàn)系統(tǒng)當(dāng)前可用內(nèi)存大小
-/+ buffers/cache行:used = total - free(Mem) - (buffers + cached),這里的free列和前面所述的available關(guān)系為available = free + 緩存(可被回收部分)
所以當(dāng)沒有available列可查看時(shí),并不能通過free命令查到或計(jì)算出真正可用內(nèi)存,需要知道緩存部分的具體情況。
選項(xiàng)-b、-k、-m、-g分別表示指定各值的單位:bytes, KB, MB, 或者 GB
7、fuser 使用文件或套接字定位進(jìn)程
fuser經(jīng)常用來查看文件被哪些進(jìn)程所使用
- [root@centos7 ~]# fuser .
- /root: 2528c 11430c 11447c
例子表示顯示有三個(gè)進(jìn)程在使用當(dāng)前目錄,其中:2528c 前面數(shù)字表示進(jìn)程PID,后面的字符c表示當(dāng)前目錄(即進(jìn)程在此目錄下工作),還可能出現(xiàn)的字符有:
- e 表示進(jìn)程正在運(yùn)行執(zhí)行文件
- f 打開文件,默認(rèn)輸出時(shí)省略
- F 寫方式打開文件,默認(rèn)時(shí)輸出省略
- r 根目錄
- m mmap文件或共享庫文件
選項(xiàng)-k表示發(fā)送信號SIGKILL給相關(guān)進(jìn)程(謹(jǐn)慎使用)
選項(xiàng)-i表示交互,在kill一個(gè)進(jìn)程之前詢問用戶
選項(xiàng)-l列出支持的信號
選項(xiàng)-SIGNAL指定信號
8、lsof 列出打開文件
在這一篇中我們簡單描述了bash進(jìn)程打開的前三個(gè)文件,并分別關(guān)聯(lián)到文件描述符0,1,2。對于其他進(jìn)程打開的文件也是同樣,系統(tǒng)為每個(gè)進(jìn)程維護(hù)一個(gè)文件描述符表,該表的值都是從0開始的數(shù)字。單獨(dú)執(zhí)行l(wèi)sof命令時(shí)會(huì)顯示系統(tǒng)中所有進(jìn)程打開的文件
- #命令版本為4.87
- [root@centos7 temp]# lsof |head
- COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
- systemd 1 root cwd DIR 253,0 4096 128 /
- systemd 1 root rtd DIR 253,0 4096 128 /
- systemd 1 root txt REG 253,0 1489960 6044 /usr/lib/systemd/systemd
- systemd 1 root mem REG 253,0 20032 201329002 /usr/lib64/libuuid.so.1.3.0
- systemd 1 root mem REG 253,0 252704 201330338 /usr/lib64/libblkid.so.1.1.0
- systemd 1 root mem REG 253,0 90632 201328968 /usr/lib64/libz.so.1.2.7
- systemd 1 root mem REG 253,0 19888 201329137 /usr/lib64/libattr.so.1.1.0
- systemd 1 root mem REG 253,0 19520 201328509 /usr/lib64/libdl-2.17.so
- systemd 1 root mem REG 253,0 153192 201328867 /usr/lib64/liblzma.so.5.0.99
每行一個(gè)打開的文件,表頭各列意為:
- COMMAND 進(jìn)程命令名前9個(gè)字符
- PID 進(jìn)程ID
- TID 任務(wù)ID
- FD 1)文件描述符號或者下面字符:
- cwd 當(dāng)前工作目錄
- err FD錯(cuò)誤信息
- ltx 共享庫代碼
- mem 內(nèi)存映射文件
- mmap 內(nèi)存映射設(shè)備
- pd 父目錄
- rtd 根目錄
- txt 程序代碼
- 2)當(dāng)是FD(數(shù)字)時(shí),后面可能跟下面權(quán)限字符:
- r 讀
- w 寫
- u 讀寫
- 空格 權(quán)限未知且無鎖定字符
- - 權(quán)限未知但有鎖定字符
- 3)權(quán)限字符后可能有如下鎖定字符:
- r 文件部分讀鎖
- R 整個(gè)文件讀鎖
- w 文件部分寫鎖
- W 整個(gè)文件寫鎖
- u 任意長度讀寫鎖
- U 未知類型鎖
- 空格 無鎖
- TYPE 類型,可能值為:
- DIR 目錄
- REG 普通文件
- CHR 字符設(shè)備文件
- BLK 塊設(shè)備文件
- FIFO 管道文件
- unix UNIX套接字文件
- IPv4 IPv4套接字文件
- ....
- DEVICE 設(shè)備號
- SIZE/OFF 文件大小或偏移量(bytes)
- NODE 文件inode號
選項(xiàng)-n表示不做ip到主機(jī)名的轉(zhuǎn)換
選項(xiàng)-c string顯示COMMAND列中包含指定字符的進(jìn)程所有打開的文件
選項(xiàng)-u username顯示所屬user進(jìn)程打開的文件
選項(xiàng)-d FD顯示打開的文件描述符為FD的文件
- [root@centos7 ~]# lsof -d 4
- COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
- systemd 1 root 4u a_inode 0,9 0 5755 [eventpoll]
- systemd-j 539 root 4u unix 0xffff880230168f00 0t0 10467 /run/systemd/journal/socket
- systemd-u 549 root 4u unix 0xffff88003693d640 0t0 12826 /run/udev/control
- lvmetad 555 root 4wW REG 0,18 4 8539 /run/lvmetad.pid
- auditd 693 root 4w REG 253,0 701364 208737917 /var/log/audit/audit.log
- ....
選項(xiàng)+d DIR顯示目錄中被進(jìn)程打開的文件
選項(xiàng)+D DIR遞歸顯示目錄中被進(jìn)程打開的文件
- [root@centos7 ~]# lsof +d /root|head -3
- COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
- bash 2528 root cwd DIR 253,0 4096 201326721 /root
- bash 12902 root cwd DIR 253,0 4096 201326721 /root
選項(xiàng)-i表示顯示符合條件的進(jìn)程打開的文件,格式為[46][protocol][@hostname|hostaddr][:service|port]
- #查看22端口運(yùn)行情況
- [root@centos7 ~]# lsof -ni :22
- COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
- sshd 1358 root 3u IPv4 8979 0t0 TCP *:ssh (LISTEN)
- sshd 1358 root 4u IPv6 8981 0t0 TCP *:ssh (LISTEN)
- sshd 12900 root 3u IPv4 3509687 0t0 TCP 10.0.1.254:ssh->192.168.78.143:57325 (ESTABLISHED)
- #例子,smtp為/etc/services文件中列出服務(wù)中的一種
- [root@centos7 ~]# lsof -ni 4TCP@0.0.0.0:22,smtp
- COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
- sshd 1358 root 3u IPv4 8979 0t0 TCP *:ssh (LISTEN)
- master 2162 root 13u IPv4 16970 0t0 TCP 127.0.0.1:smtp (LISTEN)
- sshd 12900 root 3u IPv4 3509687 0t0 TCP 10.0.1.254:ssh->192.168.78.143:57325 (ESTABLISHED)
試想,如果刪除了一個(gè)正在被其他進(jìn)程打開的文件會(huì)怎樣?實(shí)驗(yàn)來看看現(xiàn)象:
- #使用more命令查看一個(gè)文件
- [root@centos7 ~]# more /root/.bash_history
- #在另一個(gè)終端使用lsof查看
- [root@centos7 ~]# lsof|grep ^more
- more 14470 root cwd DIR 253,0 4096 201326721 /root
- more 14470 root rtd DIR 253,0 4096 128 /
- more 14470 root txt REG 253,0 41096 134321844 /usr/bin/more
- more 14470 root mem REG 253,0 106065056 134319094 /usr/lib/locale/locale-archive
- more 14470 root mem REG 253,0 2107816 201328503 /usr/lib64/libc-2.17.so
- more 14470 root mem REG 253,0 174520 201328905 /usr/lib64/libtinfo.so.5.9
- more 14470 root mem REG 253,0 164440 225392061 /usr/lib64/ld-2.17.so
- more 14470 root mem REG 253,0 272001 67147302 /usr/share/locale/zh_CN/LC_MESSAGES/util-linux.mo
- more 14470 root mem REG 253,0 26254 201328839 /usr/lib64/gconv/gconv-modules.cache
- more 14470 root 0u CHR 136,1 0t0 4 /dev/pts/1
- more 14470 root 1u CHR 136,1 0t0 4 /dev/pts/1
- more 14470 root 2u CHR 136,1 0t0 4 /dev/pts/1
- more 14470 root 3r REG 253,0 17656 202386313 /root/.bash_history
- #刪除這個(gè)文件
- [root@centos7 ~]# rm -f /root/.bash_history
- #查看
- [root@centos7 ~]# lsof -d 3|grep ^more
- more 14470 root 3r REG 253,0 17656 202386313 /root/.bash_history (deleted)
- [root@centos7 ~]#
- #會(huì)發(fā)現(xiàn)文件列多出了delete的字樣
linux系統(tǒng)中/proc目錄保存了系統(tǒng)所有進(jìn)程相關(guān)的數(shù)據(jù),里面的數(shù)字目錄名即為PID。我們進(jìn)一步來看一下剛才的more進(jìn)程的文件描述符
- [root@centos7 ~]# cat /proc/14470/fd/3 > /root/.bash_history.bak
- #此操作會(huì)將文件描述符3中的內(nèi)容保存至/root/.bash_history.bak
- #停止more進(jìn)程并查看
- [root@centos7 ~]# ls -l /root/.bash_history*
- -rw-r--r-- 1 root root 17656 11月 30 07:47 /root/.bash_history.bak
- [root@centos7 ~]# cat /root/.bash_history.bak
- #會(huì)發(fā)現(xiàn)原文件沒有了,新文件保存了原文件的所有內(nèi)容
結(jié)論就是,如果在刪除文件的時(shí)候有進(jìn)程正在打開該文件,那么該文件的內(nèi)容還是可以通過進(jìn)程的對應(yīng)文件描述符恢復(fù)的。同時(shí),如果刪除了某文件,發(fā)現(xiàn)空間并沒有釋放,說明有進(jìn)程正在打開該文件(命令lsof|grep delete查看),重新啟動(dòng)該進(jìn)程之后,空間就會(huì)得到釋放。
9、iostat 顯示CPU、I/O統(tǒng)計(jì)信息
- [root@centos7 ~]# iostat
- Linux 3.10.0-327.el7.x86_64 (centos7) 2016年11月30日 _x86_64_ (8 CPU)
- avg-cpu: %user %nice %system %iowait %steal %idle
- 0.12 0.00 0.03 0.00 0.00 99.85
- Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
- sda 0.23 0.79 3.05 4178309 16079082
- dm-0 0.22 0.57 2.94 3002207 15480498
- dm-1 0.00 0.00 0.00 1088 0
- dm-2 0.03 0.22 0.11 1146430 596232
- dm-3 0.06 0.01 1.91 28900 10079073
- dm-4 0.03 0.01 1.91 28644 10079073
顯示信息中cpu部分在命令top的描述中都有相應(yīng)的解釋,I/O部分是各個(gè)設(shè)備讀寫速率及總量信息,其中tps表示每秒多少次I/O請求
選項(xiàng)-c顯示CPU信息
選項(xiàng)-d顯示設(shè)備信息
選項(xiàng)-x顯示更詳細(xì)的信息
命令iostat m n數(shù)字(m,n),m表示時(shí)間間隔,n表示次數(shù);此時(shí)iostat會(huì)每隔m秒打印一次,打印n次。
- [root@centos7 ~]# iostat -c 1 3
- Linux 3.10.0-327.el7.x86_64 (centos7) 2016年11月30日 _x86_64_ (8 CPU)
- avg-cpu: %user %nice %system %iowait %steal %idle
- 0.12 0.00 0.03 0.00 0.00 99.85
- avg-cpu: %user %nice %system %iowait %steal %idle
- 0.12 0.00 0.00 0.00 0.00 99.88
- avg-cpu: %user %nice %system %iowait %steal %idle
- 0.12 0.00 0.12 0.00 0.00 99.75
也可以接設(shè)備名表示查看指定設(shè)備的I/O信息
- [root@centos7 ~]# iostat sda
- Linux 3.10.0-327.el7.x86_64 (centos7) 2016年11月30日 _x86_64_ (8 CPU)
- avg-cpu: %user %nice %system %iowait %steal %idle
- 0.12 0.00 0.03 0.00 0.00 99.85
- Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
- sda 0.23 0.79 3.05 4178309 16084862
10、vmstat 顯示虛擬內(nèi)存統(tǒng)計(jì)信息
- vmstat [options] [delay [count]]
同樣也會(huì)顯示一些CPU和I/O的信息
選項(xiàng)-w格式化輸出
- [root@centos7 ~]# vmstat -w
- procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu--------
- r b swpd free buff cache si so bi bo in cs us sy id wa st
- 1 0 0 4517628 3184 3067904 0 0 0 1 1 0 0 0 100 0 0
其中
- procs
- r 表示可運(yùn)行狀態(tài)進(jìn)程數(shù)量
- b 表示不可中斷睡眠狀態(tài)進(jìn)程數(shù)量
- memory
- swpd 虛擬內(nèi)存使用量
- free 空閑內(nèi)存
- buff buffer緩沖中內(nèi)存使用量
- cache cache緩存中內(nèi)存使用量
- swap
- si 硬盤交換至內(nèi)存量
- so 內(nèi)存交換至硬盤量
- io
- bi 從塊設(shè)備中收到的塊(blocks)數(shù)
- bo 發(fā)送至塊設(shè)備的塊數(shù)
- system
- in 每秒中斷次數(shù),包括鎖。
- cs 每秒進(jìn)程上下文切換次數(shù)。
- cpu (同命令top)
- us 用戶態(tài)任務(wù)占用CPU時(shí)間百分比
- sy 內(nèi)核態(tài)任務(wù)占用CPU時(shí)間百分比
- id CPU空閑時(shí)間百分比
- wa 等待輸入輸出的進(jìn)程占用CPU時(shí)間百分比
- st 虛擬機(jī)等待真實(shí)物理機(jī)CPU資源的時(shí)間
選項(xiàng)-m顯示slab信息
選項(xiàng)-s顯示各種內(nèi)存計(jì)數(shù)器及其信息
選項(xiàng)-d顯示磁盤I/O信息
選項(xiàng)-p device顯示設(shè)備分區(qū)詳細(xì)I/O信息
同iostat一樣也支持按頻率打印次數(shù)
11、mpstat 顯示CPU相關(guān)信息
- mpstat [options] [interval [count]]
顯示信息和top命令相似
- [root@centos7 ~]# mpstat 1 2
- Linux 3.10.0-327.el7.x86_64 (centos7) 2016年11月30日 _x86_64_ (8 CPU)
- 09時(shí)18分19秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
- 09時(shí)18分20秒 all 0.12 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.88
- 09時(shí)18分21秒 all 0.12 0.00 0.12 0.00 0.00 0.00 0.00 0.00 0.00 99.75
- 平均時(shí)間: all 0.12 0.00 0.06 0.00 0.00 0.00 0.00 0.00 0.00 99.81
選項(xiàng)-A顯示所有CPU及中斷信息相當(dāng)于執(zhí)行mpstat -I ALL -P ALL
選項(xiàng)-I { SUM | CPU | SCPU | ALL }顯示中斷信息
選項(xiàng)-P { cpu [,...] | ON | ALL }顯示CPU信息
- [root@centos7 ~]# mpstat -P 3,5
- Linux 3.10.0-327.el7.x86_64 (centos7) 2016年11月30日 _x86_64_ (8 CPU)
- 09時(shí)29分03秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
- 09時(shí)29分03秒 3 0.15 0.00 0.04 0.00 0.00 0.00 0.00 0.00 0.00 99.81
- 09時(shí)29分03秒 5 0.11 0.00 0.03 0.00 0.00 0.00 0.00 0.00 0.00 99.86
本文簡單介紹了linux中進(jìn)程和內(nèi)存的相關(guān)命令,進(jìn)程和內(nèi)存在計(jì)算機(jī)操作系統(tǒng)中非常重要,涉及到的內(nèi)容也非常多,這里就不做展開了。