進程管理

一、進程概述

1、進程的概念

       用戶通過執行命令,將程序提起到內存中運行,運行中的程序即稱為進程。內核為了方便管理,根據內核發起者的權限、屬性等參數,為每個進程設置一個獨立的PID號,通過PID號來判斷進程的權限。

2、進程的分類:

       2.1根據進程與終端的關系劃分:

              守護進程:在系統引導過程中啟動的進程,與終端無關的進程

              交互式進程(用戶進程):用戶通過終端啟動的進程

              在終端上運行的進程,可以被送往后臺,以守護進程的模式運行。

       2.2根據系統資源的占用比劃分:

              CPU密集型:CPU-Bound,在分配優先級時,因其會占用較多的CPU資源,應給其分配較低的優先級

              IO密集型:IO-Bound,在分配優先級時,應給其分配較高的優先級

3、進程的屬性:

       進程的ID(PID):進程的唯一標識

       啟動進程的用戶ID和屬組ID:進程在運行時,為了完成任務需要訪問到某些文件。內核如何判斷進程是否具有訪問權限呢?有兩種情況:一、被發起為進程的程序不具有SGID權限,在此情況下,內核根據進程發起者的屬主和屬組對該文件是權限來判斷;二、程序具有SGID權限,內核根據程序文件的屬主和屬組對該文件的權限來判斷。

       父進程及父進程的ID(PPID):

       進程狀態

       進程執行優先級

       進程所連接的終端名

       進程資源占用比:如CPU占用百分比、內存占用百分比

       2.1)進程的父子關系

              進程由其父進程創建。父進程出于完成復雜任務的需要,創建子進程。子進程也可以創建自己的子進程。

              在CentOS6系列中,系統在啟動之后,會加載運行內核代碼,在內核控制系統之后,由內核創建進程,內核創建的第一個進程為init進程,init進程創建完成,意味著內核空間創建完成,用戶空間也創建完成,之后由init進程接管系統,init進程為系統上所有進程的父進程。內核則退居幕后,只負責特權級操作。

blob.png

         父進程如何創建子進程:父進程通過fork-and-exec流程來創建子進程。首先以fork的方式復制一個與父進程相同的暫存進程,之后暫存進程以exec的方式加載實際要執行的進程。

              例:創建一個ping.sh腳本,其功能為通過ping命令判斷192.168.1.200主機是否可達。腳本創建完成之后,運行腳本,之后腳本以子進程的形式運行ping命令。

 blob.png

   寫時復制機制(COW):子進程指向的內存空間同父進程,一旦子進程需要修改父進程的數據,這時父進程會將數據復制到空閑的內存空間中,同時告知子進程在新內存空間中進程操作,這樣的機制就稱為寫時復制。

       2.2)進程的狀態

              運行態:正在運行的進程,running

              就緒態:可以被允許但沒被允許,用ready標識

              睡眠態:

                     可中斷睡眠:interruptable

                     不可中斷睡眠:進程發起I/O請求,內核在接到請求到完成請求響應之間,會將進程的狀態調整為不可中斷睡眠態,用uninterruptable標識

                            在什么情況下進程會被中斷:進程為了完成任務,發起I/O請求,但進程請求的數據在內存中沒有,此時進程會像內核提起請求,內核從磁盤中將該數據加載至內核的內存空間中,再將數據從內核內存空間復制至進程的內存空間。在這一過程中,進程處于中斷狀態。

              停止態:暫停于內存中,單不會被調度,除非手動啟動,用stopped標識

              僵死態:一般情況下,子進程生命周期結束后都由父進程進行銷毀。但當子進程的父進程被殺死之后,父進程未指定如何處理子進程,該子進程會進入僵死態,直至被init進程處理。用Zombie標識

              處于僵死態的進程會占用內存空間,若此類進程出現多個,則有可能造成內存空間不足。

       2.3)進程優先級

              進程優先級用于標識進程的運行次序。由內核負責調度

              進程優先級分類:

                     系統優先級:0-139

                            實時優先級:1-99。數值越大,優先級越高

                            靜態優先級:100-139。用戶可以調度,數值越小,越優級越高

                     優先級的Nice值:-20-19,與靜態優先級一一對應,數值越小,越優級越高

              可通過調整Nice值來改變進程的優先級。但普通用戶只能調低優先級,root則不受限。

blob.png

4、進程隊列

       CPU時間片:將CPU時間分割成片,每個進程占用一個時間片,時間片耗完之后,切換至下一個進程。

       運行在CPU的進程根據運行狀態被分別保存至CPU中的運行隊列和過期隊列中。

       運行隊列有等待被運行的進程組成。

       進程運行之后,被劃分到過期隊列中。

       當運行隊列中的所有進程都被允許之后,運行隊列被清空,此時,運行隊列會被轉換為過期隊列,過期隊列則相應地轉換為運行隊列。

5、進程間通信: Inter Process Communication(IPC)

       5.1 linux進程間通信方式:

       1)管道(Pipe)及有名管道(named pipe):管道可用于具有親緣關系進程間的通信,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關系進程間的通信;

       2)信號(Signal):信號是比較復雜的通信方式,用于通知接受進程有某種事件發生,除了用于進程間通信外,進程還可以發送信號給進程本身;linux除了支持Unix早期信號語義函數sigal外,還支持語義符合Posix.1標準的信號函數sigaction。

       3)報文(Message)隊列(消息隊列):消息隊列是消息的鏈接表,包括Posix消息隊列system V消息隊列。有足夠權限的進程可以向隊列中添加消息,被賦予讀權限的進程則可以讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式字節流以及緩沖區大小受限等缺點。

       4)共享內存(ShareMemory):使得多個進程可以訪問同一塊內存空間,是最快的可用IPC形式。是針對其他通信機制運行效率較低而設計的。往往與其它通信機制,如信號量結合使用,來達到進程間的同步及互斥。

       5)信號量(Semaphore):主要作為進程間以及同一進程不同線程之間的同步手段。

       6)套接口(Socket):更為一般的進程間通信機制,可用于不同機器之間的進程間通信。Linux和System V的變種都支持套接字。

       5.2不同主機進程間通信:

              基于Socket實現不同主機間進程通信。

blob.png

Socket文件存source_ip,source_port,des_ip,des_port。進程P1通過open socket文件,請求發起同PC2的P2進程間通信,通信結束之后,close socket文件。

二、進程查找

1、ps [options] | Pattern:靈活的查找方式

例:查找root用戶發起的進程

blob.png

例:查找http服務相關的進程

blob.png

2、pgrep:按預定義的模式搜索進程

              pgrep [options] pattern

                     -u uid :effective user

                     -U user:realuser

                     -t Terminal:與指定的終端相關的進程

                     -l :顯示進程名

                     -a :顯示完整格式的進程名

                     -P pid:顯示此進程的子進程

blob.png

例:查找root用戶的進程并顯示進程名

blob.png

3、pidof:查找正在運行的進程的id

blob.png

三、進程觀察

1、pstree:以樹型圖查看當前系統進程

blob.png

       pstree -p:顯示進程樹,同時顯示進程id號

blob.png

2、ps命令:以快照的方式報告當前進程的狀態信息

              內核的狀態信息保存在/proc/目錄中,進程的信息也保存在/proc目錄下,并以pid號的方式保存為目錄

blob.png

       2.1)ps命令的選項有三種風格:

              UNIX風格:-a,短選項

              BSD風格:a,不加-

              GNU風格:–all,長選項

       2.2)啟動進程的方式:

              系統啟動過程中自動啟動:與終端無關的進程

              用戶通過終端啟動:與終端相關的進程

       2.3)ps選項

              a:所有與終端相關的進程

              x:所有與終端無關的進程

              u:以用戶為中心組織進行狀態信息顯示

              2.3.1)常用組合之一:aux

例:

blob.png

依次可以查看到

         進程的發起者(USER),進程id(PID),CPU占有率(%CPU),內存占用率(%MEM),虛擬內存集(VSZ),常駐內存集(RSS),在哪個終端啟動(TTY),進程狀態(STAT),進程開始時間(START),進程CPU占用時間(TIME),發起進程的命令(COMMAND)

              STAT:進程的狀態。進程狀態分類如下:

                                   R:running                             

                                   S:interruptable sleeping            

                                   D:uninterruptable sleeping       

                                   T:stopped                                    

                                   Z:Zombie                                    

                                   +:前臺進程

                                   l:多線程進程

                                   N:低優先級進程

                                   <:高優先級進程

                                   s:session leader

              2.3.2)常用組合之二:-ef

                     -e:顯示所有進程

                     -f:顯示完整格式的進程信息

blob.png

依次可以看到進程發起者、進程id、進程的父進程id、CPU占用百分比、進程發起時間、進程發起終端、CPU占用時長、發起進程命令

              2.3.3)常用組合之三:-eFH

                     -F:顯示完整格式的進程信息

                                   C:(cpu utilization) cpu占用百分比

                                   PSR:運行于哪顆CPU之上

                     -H:以層級結構顯示進程的相關信息

blob.png

              2.3.4)常用組合之四:

                            o field1,field2….:自定義要顯示的字段列表,以逗號分隔

                            常用的field:pid、ni、pri,psr、pcpu、stat、comm、tty、ppid、rtprio

                                          ni:nice至-20—19

                                                   對應優先級的100-139

                                                   越小越優先

                                          pri:priority 優先級

                                          rtprio:real time priority實時優先級

                            -eo

                            -axo

例:自定義顯示進程的ID,進程的父進程ID,命令,Nice值,進程優先級,實時優先級,cpu占用率,進程狀態信息

blob.png

3、uptime命令:

              顯示系統時間、允許時長、平均負載

              平均負載:過去1分鐘、過去5分鐘、過去15分鐘CPU等待運行的進程隊列的長度。

blob.png

4、top命令:實時查看進程信息的變化

blob.png

首部信息:

       第一行顯示的信息:依次

              *當前系統時間

              *開機到當前所經過的時間

              *已登陸系統的使用者人數

              *uptime命令的結果顯示,表示系統在1,5,15分鐘的平均工資負載,即CPU運行隊列里的進程個數

              通過l命令顯示或關閉

       第二行顯示的信息:顯示當前系統上運行的進程總數,以及每個狀態的進程個數。如果zombie數目不為0,則應當檢查下是哪個進程變成僵尸,及時進行清理,避免占用內存。

       第三行顯示的信息:顯示CPU的整體負載情況。依次分別顯示用戶空間進程占用的CPU百分比(%us)、系統空間進程占用的CPU空間百分比(%sy)、調整進程Nice值所耗的CPU時間(%ni)、空閑的CPU百分比(%id)、等待I/O的CPU百分比(%wa)、硬中斷所耗CPU(%hi)、軟中斷所耗CPU(%si)、被虛擬機偷走的時間(5ST)

              tasks及cpu信息:可以使用t命令顯示或關閉

       最后兩行顯示內存信息:

              m命令顯示或關閉

blob.png

top下半部分,顯示每個進程占用的系統資源情況。

依次為

       PID進程id

       USER進程發起者

       PR進程優先級

       NI進程Nice值

       VIRT進程占用的RSS和SWAP空間總和

       RES進程使用的非交換分區的物理內存

       SHR進程占用的共享內存空間大小

       S:Stat,即進程的狀態

       %CPU進程CPU占用百分比

       %MEM進程內存占用百分比

       TIME+進程占用的CPU時間總和

       COMMAN進程的命令

對顯示的信息進行排序:

       P:以占據的CPU百分比排序(默認)

       M:以占據的內存百分比排序

       T:以累計占用的cpu時間排序

退出命令:q

改變刷新時間間隔:s,默認為3秒

終止指定的進程:k

選項:

       d #:指定刷新時間間隔、運行時長及平均負載

       -b:以批次方式顯示

       -n #:顯示多少批次

如何將top的信息保存至文本中

例:將top的信息顯示2次,保存至文本中

top -b -n 2 > /tmp/top`date +%F-%T`.txt

blob.png 

5、htop命令:類似于top命令

       選項:

              -d #:指定延遲時間間隔

              -u UserName:僅顯示指定用戶的進程

              -s colume:以指定字段進行排序

       子命令:

              l:顯示選定的進程打開的文件列表

              s:跟蹤選定的進程的系統調用

              t:以層級關系顯示各進程狀態

              a:將選定的進程綁定至某指定的cpu核心             

       F1:查看幫助

       F2:設置htop

6、vmstat:

blob.png

       vmstat [options] [delay] [count]

              procs:

                     r:等待運行的進程的個數;cpu上等待運行的任務的隊列長度

                     b:處于不可中斷睡眠態的進程個數;被阻塞的任務隊列的長度

              memory

                     swpd:交換內存使用總量

                     free:空閑的物理內存總量

                     buffer:用于buffer(緩沖)的內存總量

                     cache:用于cache(緩存)的內存總量

              swap

                     si:數據進入swap中的數據速率(kb/s)

                     so:數據離開swap的速率(kb/s)

              io

                     bi:從塊設備讀入數據到系統的速度(kb/s)

                     bo:保存數據至塊設備的速率(kb/s)

              system

                     in:interrupt,中斷速率

                     cs:context switch,上下文切換的速率

              cpu

                     us:user space

                     sy:system space

                     id:idle space

                     wa:wait time

                     st:stolen time

              選項:

                     -s  顯示內存統計數據

7、pmap命令:

       報告進程的內存映射表

       pmap [options] PID

              -x|–extended:顯示詳細信息

       另一種查看方式進程的內存映射表:cat /proc/PID/maps

8、glances命令:

需要通過epel源進行安裝,支持c/s模式進行遠程查看(可被監控系統代替)

blob.png

       常用選項:

              -b:以Byte為單位顯示網上數據速率

              -d:關閉磁盤I/O模塊

              -m:關閉mount模塊

              -n:關閉network模塊

              -t #:指定刷新時間間隔

              -1:每個cpu的相關數據單獨顯示

              -o {HTML|CSV}:指定輸出格式

              -f /Path/to/someDIR:設定輸出文件的目錄(注意,不要指定文件名)

       C/S模式下運行glances命令:

              服務模式:

                     glances -s -B IPADDR(本機的某個IP地址,用于監聽服務)

              客戶端模式:

                     glances -c IPADDR(指定遠程服務器的地址)

9、dstat:使用前需要安裝,在base源中

       dstat是一個可以取代vmstat、iostat、netstat、ifstat的多功能程序,克服了這些命令的局限性,增加了監控項??梢造`活地監控系統運行狀態并依此進程故障排除。

       dstat能實時地查看所有系統資源,例如通過統計IDE控制器當前狀態來比較磁盤利用率,或者直接通過網絡帶寬數值來比較磁盤的吞吐率。

9.1 dstat的默認輸出:

blob.png

默認輸出顯示的信息:

CPU狀態:CPU的使用率。這項報告更有趣的部分是顯示了用戶,系統和空閑部分,這更好地分析了CPU當前的使用狀況。如果你看到"wait"一欄中,CPU的狀態是一個高使用率值,那說明系統存在一些其它問題。當CPU的狀態處在"waits"時,那是因為它正在等待I/O設備(例如內存,磁盤或者網絡)的響應而且還沒有收到。

磁盤統計:磁盤的讀寫操作,這一欄顯示磁盤的讀、寫總數。

網絡統計:網絡設備發送和接受的數據,這一欄顯示的網絡收、發數據總數。

分頁統計:系統的分頁活動。分頁指的是一種內存管理技術用于查找系統場景,一個較大的分頁表明系統正在使用大量的交換空間,或者說內存非常分散,大多數情況下你都希望看到page in(換入)和page out(換出)的值是0 0。

系統統計:這一項顯示的是中斷(int)和上下文切換(csw)。這項統計僅在有比較基線時才有意義。這一欄中較高的統計值通常表示大量的進程造成擁塞,需要對CPU進行關注。服務器一般情況下都會運行運行一些程序,所以這項總是顯示一些數值。

9.2 指定監控時長和監控次數:

例:指定監控時長為2秒,共監控5次

blob.png

dstat [-afv] [options] [delay] [count]

       常用選項:

       -c|–cpu:顯示cpu相關信息

              -C #,#,#…,total:顯示指定的哪顆cpu信息,或總的cpu信息

       -d|–disk:顯示磁盤的相關信息

              -D sda,sdb…,total:顯示指定的磁盤的相關信息,或總的磁盤信息

       -g:顯示page in/out速率數據

       -m:Memory相關的統計數據

       -n:Interface相關的統計數據

例:每隔2秒統計網絡信息,個統計5次

blob.png

       -p:顯示process的相關統計數據

       -r:顯示io請求的相關的統計數據

       -s:顯示swapped的相關統計數據

       –tcp:顯示常用的tcp統計數據

       –udp:顯示監聽的udp統計數據

       –raw

       –socket:顯示網絡統計數據

例:

blob.png

       –ipc:message queue, semaphores, shared memory;查看報文隊列,信號量,關系內存信息。

blob.png   

根據資源占用比顯示進程

       –top-cpu:指出CPU占用最大的進程

       –top-io:指出正常I/O最大的進程

       –top-mem  :顯示占用最多內存的進程

       –disk-util:顯示某一時間磁盤的忙碌狀況

       –freespace:顯示當前磁盤空間使用率

       –proc-count:顯示正在運行的進程數量

       –top-bio:指出塊I/O最大的進程

例:

blob.png

例:查看全部內存都有誰在占用

blob.png

例:查看CPU資源損耗的數據

注:單獨顯示進程數時是以白色顯示,若背景為白色則無法看清,調整背景即可

blob.png

例:每隔2秒獲取磁盤IO情況,共獲取5次,并保存至文本中

blob.png

四、進程管理

1、kill命令:用于向進程發送信號,以實現對進程的管理

kill -l [signal]:查看信號類別

blob.png

常用信號:

       1)SIGUP:無需關閉進程而讓其重讀配置文件。在生產環境中,重啟服務的操作會終止業務,應被謹慎對待。

       2)SIGINT:終止正在運行的進程,相當于ctrl + c

       9)SIGKILL:殺死正在運行中的進程

       15)SIGTERM:終止運行中的后臺進程

       18)SIGCONT:讓在后臺中處于停止狀態的進程在后臺中繼續進程,比如cp 大文件時。注:需要占用前臺的進程無法通過此命令恢復運行,可使用fg命令

       19)SIGSTOP:類似于對進程發送ctrl + z信號

每個信號的標識方法有三種:

       1)、信號的數字表示

       2)、信號的完整名稱

       3)、信號的簡寫名稱           

如何向進程發信號

       kill [-s signal|-SIGNAL]  pid

例: kill掉ping 10.1.0.1這個進程

blob.png        blob.png

2、killall命令:根據進程名來殺死進程

       killall [-SIGNAL] program

       例:killall httpd

blob.png

注意:killall會殺死所有httpd進程,若不期望kill所有,應使用kill

原創文章,作者:M20-1鐘明波,如若轉載,請注明出處:http://www.www58058.com/44357

(0)
M20-1鐘明波M20-1鐘明波
上一篇 2016-09-07
下一篇 2016-09-07

相關推薦

  • 文件管理和用戶組權限管理小結

    文件管理 文件系統結構 /boot: 引導文件存放目錄,內核文件,引導加載器都存放在此目錄 /bin:供所有用戶使用的基本命令,不能關聯至獨立分區,os啟動即會用到的程序 /sbin:管理類的基本命令:不能關聯至獨立分區,os啟動即會用到的程序 /etc:配置文件目錄 /home:普通用戶家目錄 /root:管理員的家目錄 /dev: 設備文件及特殊文件存儲…

    2017-07-23
  • Linux 命令小結

    cat /proc/meminfo 校驗內存使用 cat /proc/swaps 顯示哪些swap被使用 cat /proc/version 顯示內核的版本 cat /proc/net/dev 顯示網絡適配器及統計 cat /proc/mounts 顯示已加載的文件系統 lspci -tv 羅列 PCI 設備…

    Linux干貨 2017-06-18
  • 馬哥教育網絡班26期+第一周學習宣言

    30歲前,目標年薪50w!gogogo

    Linux干貨 2016-12-27
  • bash腳本基礎認知

    編程基礎:程序:指令+數據                過程式:以指令為中心,數據服務于指令              &nbs…

    Linux干貨 2017-03-02
  • 馬哥教育網絡班21期+第8周課程練習

    1、請描述網橋、集線器、二層交換機、三層交換機、路由器的功能、使用場景與區別。 集線器 集線器也稱HUB,工作在OSI七層結構的第一層物理層,屬于共享型設備,接收數據廣播發出,在局域網內一般都是星型連接拓撲結構,每臺工作站都連接到集線器上。 由于集線器的帶寬共享特性導致網絡利用效率極低,一般在大中型的網絡中不會使用到集線器。 網橋 網橋(Bridge)也稱橋…

    Linux干貨 2016-09-01
  • CA,DNS,LAMP實現wordpress

    拓撲圖見編譯實現LAMP,bind,CA.jpg test3配置:     yum -y install bind     修改named.conf配置文件:     //      listen-on por…

    2017-04-23
欧美性久久久久