linux-進程詳解

進程概念

是程序的具體實現,執行程序的具體過程。

操作系統的一個重要功能就是爲進程提供方便,比如啓動進程,爲進程分配內存空間,管理進程的相關信息等等。

1)如何產生進程?

執行一個程序或者命令就可以啓動一個進程。進程啓動時,操作系統爲其分配相對應的系統內唯一的進程ID(PID)

Linux啓動的第一個進程: #pidof init

查看所有進程:ps -a

2)程序被加載爲進程的示意圖:

ps aux:查看所有進程及進程詳細信息
ps aux grep [關鍵字]/ps aux grep ab*:過濾後查看的指定進程詳細信息
service htttpd start:啓動服務(啓動服務爲httpd)
注☆:不同用戶只需相同程序,注意其權限的不同
查看vim進程詳細信息:ps au |grep vim

查看進程

進程查看命令:ps(process status)---將某個時間點的程序運作情況截取下來

選項和參數:

a:和輸入終端(terminal)關聯的所有process,通常與x儀器使用,列出完整信息。
x:後臺進程,通常與a這個參數一起使用,可列出較完整信息。
-u:有效使用者(effective user)相關的process
常用組合:ps aux 觀察系統所有的程序數據(常用☆☆☆☆)
ps -lA 也是能夠查看所有系統的數據
ps axjf連同部分程序樹狀態
ps -ef|grep xxx:查看某個進程
☆☆☆☆以上不用背,通過man ps查看!

進程中各項的含義:

USER:該進程屬於哪個使用者
PID:該進程的程序標識符
%CPU:該進程使用掉的CPU資源百分比
%MEN:該進程所佔用物理內存百分比
VSZ:該進程使用掉的虛擬內存量(kbytes)
RSS:該進程佔用的物理內存量(kbytes)
TTY:該process是在哪個終端機上面運作,若在終端機無關則顯示?,另外,tty1-tty6是本機上面登入這程序
若爲pts/0等等的,則表示爲由網絡連接進主機的程序。
STAT:該進程目前狀態,狀態顯示與ps -l的S旗標相同(R/S/D/T/Z)
START:該process被處罰啓動的時間
TIME:該進程實際使用CPU運作時間
COMMADN:該程序實際命令

Linux進程狀態:

R(TASK_RUNNING),指正在被CPU運行或者就緒的狀態(在run_queue隊列裏的狀態)
S(TASK_INTERRUPTIBLE),可中斷的睡眠狀態;處於等待狀態中的集成,一旦被該進程等待的資源被釋放,那麼該進程就會進入運行狀態。
D(TASK_UNINTERRUPTIBLE),不可中斷的睡眠狀態,該狀態的進程只能用wake_up()函數喚醒。
T(TASL_STOPPED or TASK_TRACED),當進程收到信號SIGSTOP,SIGTSTP/SIGTTIN或SIGTTOU時就會進入暫停狀態,可向其發送SIGCONT信號讓進程轉換到可運行狀態。
Z(TASK_DEAD-EXIT_ZOMBIE),當進程已經終止運行,但父進程還沒有詢問其狀態情況。不可被kill,即不響應信號,無法用SIGKILL殺死。

動態觀察Linux進程狀態:(類似於windows的任務管理器)

top:動態觀察程序變化,ps是截取一個時間點的程序狀態,而投top則可以持續觀察進程進行的狀態。        
top的選項和參數:        
    -d:後面可以接秒數,就是整個程序畫面更新的描述,默認是5秒。    
    -b:以批次的方式執行top,還有更多的參數可以使用,通常會搭配數據流重導向來將批次的結果輸出    
    成檔案。    
    -n:與-b搭配,意義是需要進行幾次top的輸出結果    
    -p:指定某些個PID來進行觀察檢測。    
#top -d 2,  #top -b,  #top -b-n 2           
#top -b-n 5>a.log:組織5個批次放到a.log文件中   #cat a.log        
在top執行過程中可以使用按鍵指令:        
①?:顯示在top當中可以輸入的按鍵指令        
②p:以CPU的使用資格排序顯示        
③M:以Memory的使用資源排序顯示        
④N:以PID來排序顯示        
⑤T:由該Process使用的CPU時間累積(TIME+)排序        
⑥k:給予某個PID後kill該進程        
⑦r:給予某個PID重新制定一個nice值        
⑧q:離開top軟件的按鍵

查看進程樹:pstree,選項與參數:

-A:各程序樹之間的連接以ASCII字符來連接        
-U:各程序樹之間連接以萬國碼字符來連接,在某些中斷接口下可能有亂碼        
-p:並同時列出每個process的PID        
-u:並同時列出每個process的所屬賬號和名稱。        
系統進程樹同時顯示PID與user(root身份來執行,屬於root的程序不會顯示)        
例:pstree -Aup

進程管理

Kill發送信號(並不只是殺進程)        
選項與參數:        
1)-l:這個是L的小寫,列出目前kill能夠使用的信號(signal)有哪些,signal:向進程發送信號,指示其進行        
不同操作。用man 7 signal可知。        
2)-15:以正常的程序方式終止一個進程。        
3)-9:立刻強制終止一個進程。        
4)-2:代表不由鍵盤輸入[ctrl]-c同樣的動作。        
5)-1:對於sshd這樣的守護進程,重新讀取一次參數的配置文件(類似reload),如果進程爲非守護進程,默認終止該進程。 
※守護進程:守護進程(daemon)是一類在後臺運行的特殊進程,用於執行特定的系統任務。很多守護進程在系統引導的時候啓動,並且一直運行直到系統關閉。另一些只在需要的時候才啓動,完成任務後就自動結束。守護進程是一個在後臺運行並且不受任何終端控制的進程。        
演示可以使用hadoop(以java啓動的進程)        
查看hadoop的進程:# jps        
ps aux|grep java
對應的PID:ps ax|grep datanode
終止以某命令名稱啓動的全部進程:killall -signal 命令名

系統資源的監控

1)free:觀察內存(memory)使用情況    
-b:直接輸入free時,顯示的單位是Kbytes,我們可以使用b(bytes),m(Mbytes),k(Kbytes)及g(Gbytes)來定義顯示單位。    
-t:在輸出的最終結果時,顯示物理內存與swap的總量。    
free命令顯示選項解析:    
Mem一行顯示的是物理內存的量,Swap:虛擬內存的量,total:總量,used是已被使用的量,free則視剩餘可用的量。    
shared:共享內存,buffers:將寫磁盤的內容,cached:已寫磁盤或者已從磁盤讀取出的內容。    
2)uname:查閱系統與核心相關信息,uname [-asrmpi]    
選項與參數:    
-a:四PU皮系統相關信息,包括以下的數據都會被列出來    
-s:系統內核名稱    
-r:內核版本    
-m:本系統的硬件名稱,例如i686或x86_64等    
-p:CPU的類型與-m類似,是顯示的是CPU的類型。    
-i:硬件平臺(ix86)    
3)uptime:觀察系統啓動時間與工作負載    
顯示目前系統當前時間,已經開機多長時間,用戶數,以及1,5,15分鐘的平均負載。    
4)netstat:網絡監控,選項與參數如下:    
-a:將目前系統上所有的已經連接,監聽,socket數據都列出來    
-t:列出tcp網絡包信息    
-u:列出udp網絡包信息    
-n:以端口(port number)方式來顯示(不以程序服務名稱)    
-l:李處目前正在監聽(listen)的服務    
-p:列出該網絡的服務的進程id(PID)    
# netstat -atp :所有tcp協議的鏈接,並輸出pid號    
# netstat -antp    
netstat命令選項顯示解析:    
Proto:網絡的封包協議,主要分爲TCP與UDP封包;    
Recv-Q:接收消息緩存區,遠端進程發送而來,尚未被當前進程處理的信息數,單位:字節;    
Send-Q:發送消息緩存區,向遠端進程發送,尚未被其接受的消息數,單位:字節;    
Local Address:本端網絡地址(IP:port)    
Foreign Address:與當前進程進行行通信的遠程進程的網絡地址(IP:port)    
state:網絡連接狀態,主要郵件裏(ESTABLISED)及監聽(LISTEN)    
PID/Program name:顯示此服務的PID號碼以及程序的命令名稱    
目前系統上已在監聽的網絡連接及PID

5)vmstat:偵測系統資源變化,CPU/內存/磁盤輸入輸出狀態        
-a:使用inactive/active(活躍不否)取代buffer/cache的內存輸出信息        
-t:開機到目前爲止系統複製(fork)的進度數        
-s:將一些事件(開機至目前爲止)導致的內存變化情況列表說明        
-S:後面可以接單位,讓現實的數據有單位,例如:K/M取代bytes的容量        
-d:列出磁盤的讀寫總量統計表        
-p:後面列出磁盤分區,可現實該磁盤分區的讀寫總量和統計        
vmstat命令選項顯示解析:        
procs(進程字段):r-等待運行的進程數量;b:不可被喚醒的進程數量        
這兩個項目越多代表系統越忙碌(因爲系統太忙,所以很····法被執行或抑制在等待而無法被喚醒)        
memory(內存字段):swpd--虛擬內存被使用的容量;free:未被使用內存容量;buff/cache:用戶緩衝的內存        
swap(交換分區字段):        
si:每秒從交換分區寫到內存的數量大小,由磁盤->內存        
so:每秒寫入交換分區內存數量大小,由內存->磁盤        
如果si/so的數值太大,標識內存內的數據常常在磁盤與內存之間傳來傳去,系統性能會很差        
io(磁盤讀寫字段)        
bi:從塊設備讀入數據的總量(讀磁盤)(每秒kb);        
bo:塊設備寫入數據的總量(寫磁盤)(每秒kb)。        
如果這部分的值越高,代表系統的I/O非常忙碌。        
system(系統字段):in--每秒被中斷進程次數;cs:每秒鐘進行的事件切換次數,這兩個數值越大,代表系統與接口設備通信非常頻繁        
CPU(cpu字段):us(user)非內核態的CPU使用情況,sy(system)內核狀態所使用的CPU情況        
id:(idle)閒置的CPU情況,wa:(wait)等待I/O所耗的CPU,st:被虛擬機所盜用的CPU(2.6.11以後才支持)        
6)補充防火牆啓動、狀態查看、關閉        
#service iptables start        
#service iptables status        
#service iptables stop

任務管理

登陸bash之後,就會取得一個名爲bash的進程(它由自己的PID)了。在這個環節中所執行的其它指令,幾乎都是所謂的子進程。        
# tail -f install.log  ----啓動一個進程(用來跟蹤日誌文件)在另一個會話終端上(連接同一臺虛擬機)        
#pstree -Aup        
|-sshd(2928)-+sshd(3332)---bash(3336)---tail(3460)        
    |       -sshd(3440)---bash(3444)---pstree(3498)        
前臺進程和後臺進程:        
可以控制與執行命令的bash環境成爲前臺進程。在操作系統中自行運行,你無法使用ctrl+c終止,可以用bg/fg命令操作的任務,稱爲後臺進程。後臺執行的任務不能接收終端(terminal/shell)的輸入。        
在bash執行多個任務:        
比如:cp file1 file2 &        
重點在以上這個"&"符號,他標識將file1這個文件複製爲file2,同時將這個拷貝進程放到後臺執行。也就是說執行這一個命令後,在一個終端仍然可以做其他的工作,拷貝任務執行完成後,系統將會終端顯示完成的消息。舉例來說:我們在登陸bash後,想要一邊複製文件,一邊進行編譯,那麼就需要任務管理。直接將命令放到後臺執行&:        
在另有一個bash的環境下,如果想要同時進行多個工作,那麼可以將某些工作接放到後臺,用戶可以繼續操作前臺任務。        
舉例:將/lib/備份爲/tmp/lib.tar.gz且不想要等待其完成:        
# tar -czPf /tmp/lib.tar.gz /etc &        
[1] 3581        
[root@tedu~]#        
[1]+ Done          tar -czPf/tmp/lib.tar.gz /etc        
其中中括號爲job number,當job執行完成之後會顯示Done。        
將目前的工作丟到後臺暫停:[ctrl]+z        
#vim anaconda-ks.cfg  #ctrl+z        
[1]+ Stopped          vim anaconda ks.cfg        
說明:在vim的一版模式下,按下[ctrl]+z,屏幕上會出現[1],表示這是一個任務。        
+代表最近一個被放到後臺的任務,且目前在後臺預期會被取用的任務(調用切換到前臺命令時會第一個被調用到)        
Stopped使用[ctrl]+z放到後臺的任務都是暫停狀態        
#vim install.log  #ctrl+z        
[Z]+  Stopped         vim install.log        
首先喚醒+的任務,再喚醒-任務。        
觀察後臺任務:        
jobs查看當前工作狀態,它的選項與參數:        
-l:除了列出job number與指令串之外,同時列出PID的號碼;        
-r:僅列出正在後臺run的任務;        
-s:僅列出正在後臺暫停(stop)的任務        
將後臺任務拿到前臺執行:fg(ForeGround)        
fg %jobnumber jobnumber爲任務號碼(數字);%可有可無。        
fg 1 將任務號爲1的進程調到前臺。        
終止job:        
jobs -l        
kill -9 3375  #kill vim進程需要-9(強制kill)        
脫機及註銷後任務執行:        
nohup可以讓你在脫機活註銷後,還能夠讓工作繼續執行        
nohup [命令與參數]在當前終端前臺執行        
nohup [命令與參數]& 在後臺執行,例:nohup tail -f test &

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章