Linux基礎(chǔ)命令介紹九:進程與內(nèi)存
計算機存在的目的就是為了運行各種各樣的程序,迄今我們介紹的絕大多數(shù)命令,都是為了完成某種計算而用編程語言編寫的程序,它們以文件的形式保存在操作系統(tǒng)之中(比如/bin下的各種命令);但靜態(tài)的程序并不能“自發(fā)的”產(chǎn)生結(jié)果,只有在操作系統(tǒng)中為其指定輸入數(shù)據(jù)并運行起來,才能得到輸出結(jié)果。而操作系統(tǒng)中程序運行的最主要表現(xiàn)形式便是進程。
靜態(tài)程序可以長久的存在,動態(tài)的進程具有有限的生命周期。每次程序運行的開始(如鍵入一條命令后按下回車鍵),操作系統(tǒng)都要為程序的運行準備各種資源,這些資源絕大多數(shù)都處于內(nèi)存之中。為了限制多用戶進程的權(quán)限,linux還定義了兩種進程運行時態(tài):內(nèi)核態(tài)和用戶態(tài);當進程想要請求系統(tǒng)服務(wù)時(比如操作一個物理設(shè)備),必須通過系統(tǒng)調(diào)用(操作系統(tǒng)提供給用戶空間的接口函數(shù))來實現(xiàn),此時系統(tǒng)切換到內(nèi)核態(tài),代表程序執(zhí)行該系統(tǒng)調(diào)用,執(zhí)行完畢后系統(tǒng)切換回用戶態(tài),繼續(xù)執(zhí)行程序代碼。
本文介紹linux中關(guān)于進程與內(nèi)存的管理命令(更多的是查看命令)
1、uptime 系統(tǒng)運行時間
- uptime [options]
單獨執(zhí)行此命令時,輸出信息表示:當前時間,系統(tǒng)運行時長,登錄用戶個數(shù),系統(tǒng)過去1、5、15分鐘內(nèi)的平均負載。
- [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)進程信息
- ps [options]
單獨運行ps命令時顯示信息為:進程ID號(PID)、終端(TTY)、運行累積CPU時長(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)于進程、進程組、會話和終端的關(guān)系。linux操作系統(tǒng)為了方便管理進程,將功能相近或存在父子、兄弟關(guān)系的進程歸為一組,每個進程必定屬于一個進程組,也只能屬于一個進程組。一個進程除了有進程ID外,還有一個進程組ID(PGID);每個進程組都有一個進程組組長,它的PID和進程組ID相同。像一系列相關(guān)進程可以合并為進程組一樣,一系列進程組也可以合并成一個會話session。會話是由其中的進程建立的,該進程叫做會話的首進程(session leader)。會話首進程的PID即為此會話的SID(session ID)。每個會話都起始于用戶登錄,終止于用戶退出。會話中的每個進程組稱為一個工作(job)。會話可以有一個進程組成為會話的前臺工作(foreground),而其他的進程組是后臺工作(background)。每個會話都關(guān)聯(lián)到一個控制終端control terminal,當會話終止時(用戶退出終端),系統(tǒng)會發(fā)送終止信號(SIGHUP)給會話中的所有進程組,進程對此信號的默認處理方式為終止進程。
ps接受三種格式的選項,帶前綴符號-的UNIX格式的選項;不帶前綴的BSD風格的選項;帶兩個-的GNU長格式選項。三種類型的選項可以自由組合,但可能會出現(xiàn)沖突。
選項a(BSD)表示顯示所有和終端關(guān)聯(lián)的進程信息,當配合選項x(BSD)一起使用時表示顯示所有進程信息(此時終端無關(guān)的進程TTY列顯示為?)。
選項-a(UNIX)表示顯示與終端關(guān)聯(lián)的除了會話首進程之外的進程信息。選項-e表示所有進程。
- [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風格的選項還會顯示進程的狀態(tài)信息以及命令的參數(shù)。進程在運行的過程當中可能處于的狀態(tài)包括:
- D 不可中斷的睡眠狀態(tài)(通常在等待IO)
- R 正在運行或可以運行(在運行隊列中)
- S 可中斷的睡眠狀態(tài)(等待一個事件完成)
- T 暫停狀態(tài)
- t 跟蹤狀態(tài)
- W 換頁狀態(tài)(2.6內(nèi)核以后版本)
- X 死亡狀態(tài)(不可見)
- Z 僵死狀態(tài)
- #BSD風格的選項STAT列還可能包括以下字符
- < 高優(yōu)先級進程
- N 低優(yōu)先級進程
- L 鎖定狀態(tài)
- s 會話首進程
- l 多線程進程
- + 進程處于前臺進程組
選項u顯示用戶導向的進程信息(如進程的發(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表示實際駐留"在內(nèi)存中"的內(nèi)存大小,不包括交換出去的內(nèi)存。和VSZ的單位均為KB
通常查看所有進程信息會使用命令ps -ef或ps aux
選項-o或o表示指定輸出格式
如顯示所有bash進程的pid,命令名,運行于哪顆邏輯cpu:
- [root@centos7 ~]# ps -eo pid,comm,psr|grep bash
- 2528 bash 1
- 9336 bash 4
- 9835 bash 3
- 9938 bash 6
配合選項--sort可指定按某一列排序輸出
- #表示按用戶名排序
- ps -eo pid,user,args --sort user
還可以用-o指定許多其他信息,請查詢相關(guān)手冊。
3、kill 終止進程
- kill [options] pid...
命令kill會發(fā)送特定的信號給指定的進程或進程組,如果沒有指定信號,則發(fā)送TERM信號
選項-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 ~]#
可以使用選項-s指定要發(fā)送的信號
如在一個終端啟動進程sleep 300,在另一個終端查看并使用信號SIGKILL將其終止:
- [root@centos7 ~]# sleep 300
- #此時會一直等待sleep執(zhí)行完畢
- #在另一個終端中
- [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ā)送信號給進程
- pgrep [options] pattern
- pkill [options] pattern
這里的pattern是正則表達式,用來匹配進程名
如查看名稱為gunicorn的所有進程
- [root@centos7 ~]# pgrep gunicorn
- 17268
- 17286
- 17289
- 17290
- 17293
選項-l顯示進程名和pid
- [root@centos7 ~]# pgrep -l gun
- 17268 gunicorn
- 17286 gunicorn
- 17289 gunicorn
- 17290 gunicorn
- 17293 gunicorn
如終止所有sleep進程
- pkill sleep
如使syslogd重讀它的配置文件
- pkill -HUP syslogd
5、top 顯示進程信息
top命令實時動態(tài)的顯示系統(tǒng)匯總信息和進程狀態(tài)信息,它每隔1s刷新一次,按鍵盤q鍵退出。
單獨執(zhí)行top命令時顯示如下輸出:
- 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)容進行解釋(注:top版本為3.3.10,其他版本的輸出第四行和第五行可能不同)
***行顯示信息和命令uptime的輸出一致;
第二行顯示任務(wù)匯總信息,狀態(tài)即為進程可能狀態(tài)中的四種;
第三行顯示cpu負載信息,其中us表示用戶態(tài)任務(wù)占用CPU時間百分比,sy表示內(nèi)核態(tài)任務(wù)占用CPU時間百分比,ni表示改變過進程優(yōu)先級的進程(通過nice或renice命令)占用CPU時間百分比,id表示CPU空閑時間百分比,wa表示等待輸入輸出的進程占用CPU時間百分比,hi表示硬件中斷花費時間,si表示軟件中斷花費時間,st表示虛擬機等待真實物理機CPU資源的時間
第四行顯示內(nèi)存信息,total表示總內(nèi)存,free表示未分配內(nèi)存,used表示使用的內(nèi)存(值為total-free-buff/cache的結(jié)果),buff/cache表示緩存內(nèi)存;
第五行顯示交換分區(qū)使用量,其中avail Mem表示啟動一個新程序時可以分配給它的***內(nèi)存,和第三行free列不同的地方在于,它會統(tǒng)計可以被回收的緩存分配器(slab)和頁高速緩沖存儲器(page cache)中的內(nèi)存。(在一些較早的top實現(xiàn)中,并沒有這一列的值)
接下來經(jīng)過一個空行之后,顯示的是進程相關(guān)信息,表頭各列字段和ps命令的輸出均有相對應(yīng)的關(guān)系,其中PR表示優(yōu)先級;NI表示nice值(后述);VIRT表示虛擬內(nèi)存大小,對應(yīng)ps命令中的VSZ;RES表示進程常駐內(nèi)存大小,對應(yīng)ps命令中的RSS;SHR表示共享內(nèi)存大小;S表示進程狀態(tài),對應(yīng)ps命令的STAT;
linux系統(tǒng)的進程狀態(tài)中有一個優(yōu)先級(priority)的概念,其值是一個動態(tài)變化的整數(shù),范圍是0-139,此值越小,則優(yōu)先級越高,那么它就越優(yōu)先被CPU執(zhí)行。如果top命令PR列顯示為rt,表示此進程為實時進程,它的優(yōu)先級范圍是0-99,比其他的普通進程都要高。linux中還有靜態(tài)優(yōu)先級的概念,用戶可以通過使用命令nice和renice對進程設(shè)置或改變靜態(tài)優(yōu)先級,它可以看成是動態(tài)優(yōu)先級的修正值,能夠影響動態(tài)優(yōu)先級的值。
PR列顯示的值為實際優(yōu)先級減去實時進程***優(yōu)先級之后的值,3.10內(nèi)核非實時進程的默認值為20,即:DEFAULT_PRIO = MAX_RT_PRIO + 20 = 120
NI列不為0時,表示進程被設(shè)置過靜態(tài)優(yōu)先級值,范圍是-20到19,它與當前優(yōu)先級值的關(guān)系是:DEFAULT_PRIO = MAX_RT_PRIO + (nice) + 20
如使用nice啟動一個sleep進程:
- #當不使用選項-n指定時,默認值為10
- [root@centos7 ~]# nice -n -10 sleep 300
- #對于已存在的進程可以使用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)。它們實際的優(yōu)先級值是相等的。
上例中使用了選項-n表示top刷新次數(shù),-b表示批處理模式運行top,此模式會去掉輸出中的控制字符,方便將輸出交給其他程序處理。
選項-o fieldname按指定列排序輸出,選項-O可以列出-o能夠指定的列名
- #自行執(zhí)行命令查看效果
- top -O |tr '\n' ' '
- top -bn1 -o PR
下面簡要介紹一些top中可以使用的交互命令:
- q 退出top
- h 獲得幫助信息
- 1 顯示每個邏輯cpu的信息
- k 終止一個進程(會提示用戶輸入需要終止的pid,以及需要發(fā)送什么樣的信號)
- r 重新設(shè)置進程靜態(tài)優(yōu)先級(相當于執(zhí)行renice)
- i 忽略閑置和僵死進程
- H 顯示線程信息
- M 根據(jù)駐留內(nèi)存大小排序
- P 根據(jù)CPU使用百分比排序
- W 將當前設(shè)置寫入~/.toprc文件中
6、free 顯示系統(tǒng)內(nèi)存使用情況
- free [options]
free命令顯示系統(tǒng)當前內(nèi)存、swap(交換分區(qū))的使用情況,默認單位是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)當前還有多少可用內(nèi)存,看available的對應(yīng)值就可以了。這里available = free + 緩存(可被回收部分)。
但在較老版本的free中并沒有這個值,它的輸出可能是這樣的:
- 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è)計的
cache(緩存) 是為了提高cpu和內(nèi)存之間的數(shù)據(jù)交換速度而設(shè)計的
所以輸出中buffers可簡單理解為準備寫入硬盤的緩沖數(shù)據(jù);cached可理解為從硬盤中讀出的緩存數(shù)據(jù)(頁高速緩沖存儲器),緩存中可被回收部分來自cached和slab(緩存分配器)
Mem行:used = total - free此時的空閑內(nèi)存free列并不能體現(xiàn)系統(tǒng)當前可用內(nèi)存大小
-/+ buffers/cache行:used = total - free(Mem) - (buffers + cached),這里的free列和前面所述的available關(guān)系為available = free + 緩存(可被回收部分)
所以當沒有available列可查看時,并不能通過free命令查到或計算出真正可用內(nèi)存,需要知道緩存部分的具體情況。
選項-b、-k、-m、-g分別表示指定各值的單位:bytes, KB, MB, 或者 GB
7、fuser 使用文件或套接字定位進程
fuser經(jīng)常用來查看文件被哪些進程所使用
- [root@centos7 ~]# fuser .
- /root: 2528c 11430c 11447c
例子表示顯示有三個進程在使用當前目錄,其中:2528c 前面數(shù)字表示進程PID,后面的字符c表示當前目錄(即進程在此目錄下工作),還可能出現(xiàn)的字符有:
- e 表示進程正在運行執(zhí)行文件
- f 打開文件,默認輸出時省略
- F 寫方式打開文件,默認時輸出省略
- r 根目錄
- m mmap文件或共享庫文件
選項-k表示發(fā)送信號SIGKILL給相關(guān)進程(謹慎使用)
選項-i表示交互,在kill一個進程之前詢問用戶
選項-l列出支持的信號
選項-SIGNAL指定信號
8、lsof 列出打開文件
在這一篇中我們簡單描述了bash進程打開的前三個文件,并分別關(guān)聯(lián)到文件描述符0,1,2。對于其他進程打開的文件也是同樣,系統(tǒng)為每個進程維護一個文件描述符表,該表的值都是從0開始的數(shù)字。單獨執(zhí)行l(wèi)sof命令時會顯示系統(tǒng)中所有進程打開的文件
- #命令版本為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
每行一個打開的文件,表頭各列意為:
- COMMAND 進程命令名前9個字符
- PID 進程ID
- TID 任務(wù)ID
- FD 1)文件描述符號或者下面字符:
- cwd 當前工作目錄
- err FD錯誤信息
- ltx 共享庫代碼
- mem 內(nèi)存映射文件
- mmap 內(nèi)存映射設(shè)備
- pd 父目錄
- rtd 根目錄
- txt 程序代碼
- 2)當是FD(數(shù)字)時,后面可能跟下面權(quán)限字符:
- r 讀
- w 寫
- u 讀寫
- 空格 權(quán)限未知且無鎖定字符
- - 權(quán)限未知但有鎖定字符
- 3)權(quán)限字符后可能有如下鎖定字符:
- r 文件部分讀鎖
- R 整個文件讀鎖
- w 文件部分寫鎖
- W 整個文件寫鎖
- u 任意長度讀寫鎖
- U 未知類型鎖
- 空格 無鎖
- TYPE 類型,可能值為:
- DIR 目錄
- REG 普通文件
- CHR 字符設(shè)備文件
- BLK 塊設(shè)備文件
- FIFO 管道文件
- unix UNIX套接字文件
- IPv4 IPv4套接字文件
- ....
- DEVICE 設(shè)備號
- SIZE/OFF 文件大小或偏移量(bytes)
- NODE 文件inode號
選項-n表示不做ip到主機名的轉(zhuǎn)換
選項-c string顯示COMMAND列中包含指定字符的進程所有打開的文件
選項-u username顯示所屬user進程打開的文件
選項-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
- ....
選項+d DIR顯示目錄中被進程打開的文件
選項+D DIR遞歸顯示目錄中被進程打開的文件
- [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
選項-i表示顯示符合條件的進程打開的文件,格式為[46][protocol][@hostname|hostaddr][:service|port]
- #查看22端口運行情況
- [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)
試想,如果刪除了一個正在被其他進程打開的文件會怎樣?實驗來看看現(xiàn)象:
- #使用more命令查看一個文件
- [root@centos7 ~]# more /root/.bash_history
- #在另一個終端使用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
- #刪除這個文件
- [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 ~]#
- #會發(fā)現(xiàn)文件列多出了delete的字樣
linux系統(tǒng)中/proc目錄保存了系統(tǒng)所有進程相關(guān)的數(shù)據(jù),里面的數(shù)字目錄名即為PID。我們進一步來看一下剛才的more進程的文件描述符
- [root@centos7 ~]# cat /proc/14470/fd/3 > /root/.bash_history.bak
- #此操作會將文件描述符3中的內(nèi)容保存至/root/.bash_history.bak
- #停止more進程并查看
- [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
- #會發(fā)現(xiàn)原文件沒有了,新文件保存了原文件的所有內(nèi)容
結(jié)論就是,如果在刪除文件的時候有進程正在打開該文件,那么該文件的內(nèi)容還是可以通過進程的對應(yīng)文件描述符恢復的。同時,如果刪除了某文件,發(fā)現(xiàn)空間并沒有釋放,說明有進程正在打開該文件(命令lsof|grep delete查看),重新啟動該進程之后,空間就會得到釋放。
9、iostat 顯示CPU、I/O統(tǒng)計信息
- [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部分是各個設(shè)備讀寫速率及總量信息,其中tps表示每秒多少次I/O請求
選項-c顯示CPU信息
選項-d顯示設(shè)備信息
選項-x顯示更詳細的信息
命令iostat m n數(shù)字(m,n),m表示時間間隔,n表示次數(shù);此時iostat會每隔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)計信息
- vmstat [options] [delay [count]]
同樣也會顯示一些CPU和I/O的信息
選項-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 表示可運行狀態(tài)進程數(shù)量
- b 表示不可中斷睡眠狀態(tài)進程數(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 每秒進程上下文切換次數(shù)。
- cpu (同命令top)
- us 用戶態(tài)任務(wù)占用CPU時間百分比
- sy 內(nèi)核態(tài)任務(wù)占用CPU時間百分比
- id CPU空閑時間百分比
- wa 等待輸入輸出的進程占用CPU時間百分比
- st 虛擬機等待真實物理機CPU資源的時間
選項-m顯示slab信息
選項-s顯示各種內(nèi)存計數(shù)器及其信息
選項-d顯示磁盤I/O信息
選項-p device顯示設(shè)備分區(qū)詳細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時18分19秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
- 09時18分20秒 all 0.12 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.88
- 09時18分21秒 all 0.12 0.00 0.12 0.00 0.00 0.00 0.00 0.00 0.00 99.75
- 平均時間: all 0.12 0.00 0.06 0.00 0.00 0.00 0.00 0.00 0.00 99.81
選項-A顯示所有CPU及中斷信息相當于執(zhí)行mpstat -I ALL -P ALL
選項-I { SUM | CPU | SCPU | ALL }顯示中斷信息
選項-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時29分03秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
- 09時29分03秒 3 0.15 0.00 0.04 0.00 0.00 0.00 0.00 0.00 0.00 99.81
- 09時29分03秒 5 0.11 0.00 0.03 0.00 0.00 0.00 0.00 0.00 0.00 99.86
本文簡單介紹了linux中進程和內(nèi)存的相關(guān)命令,進程和內(nèi)存在計算機操作系統(tǒng)中非常重要,涉及到的內(nèi)容也非常多,這里就不做展開了。