??谧鼍W(wǎng)站10大品牌優(yōu)化大師使用心得
本篇將介紹Linux的進(jìn)程管理相關(guān)知識(shí),并將深入介紹Linux的進(jìn)程間相互通信。
進(jìn)程就是運(yùn)行中的程序,一個(gè)運(yùn)行著的程序,可能有多個(gè)進(jìn)程。 比如Oracle DB,啟動(dòng)Oracle實(shí)例服務(wù)后,就會(huì)有多個(gè)進(jìn)程。
Linux進(jìn)程分類
在 Linux 系統(tǒng)中,進(jìn)程可以分為以下幾類:
1、用戶進(jìn)程和系統(tǒng)進(jìn)程
用戶進(jìn)程:
–由用戶啟動(dòng)的應(yīng)用程序或服務(wù),例如文本編輯器、瀏覽器、數(shù)據(jù)庫客戶端等。
–這些進(jìn)程在用戶的權(quán)限下運(yùn)行,通常只能訪問用戶自己的數(shù)據(jù)和資源。
–用戶進(jìn)程的優(yōu)先級(jí)相對(duì)較低,系統(tǒng)會(huì)根據(jù)資源的可用性和其他因素來調(diào)度它們的執(zhí)行。
系統(tǒng)進(jìn)程:
–由操作系統(tǒng)內(nèi)核啟動(dòng)的進(jìn)程,用于管理系統(tǒng)資源、提供服務(wù)和執(zhí)行系統(tǒng)級(jí)任務(wù)。例如,init進(jìn)程(或systemd進(jìn)程)是系統(tǒng)啟動(dòng)時(shí)第一個(gè)運(yùn)行的進(jìn)程,負(fù)責(zé)啟動(dòng)其他系統(tǒng)服務(wù)和管理系統(tǒng)的運(yùn)行狀態(tài)。
–系統(tǒng)進(jìn)程通常具有較高的優(yōu)先級(jí),以確保系統(tǒng)的穩(wěn)定運(yùn)行和對(duì)關(guān)鍵任務(wù)的響應(yīng)。
2、前臺(tái)進(jìn)程和后臺(tái)進(jìn)程
前臺(tái)進(jìn)程:
–與用戶交互的進(jìn)程,通常在終端窗口中運(yùn)行,接收用戶的輸入并顯示輸出。例如,當(dāng)你在終端中運(yùn)行一個(gè)命令時(shí),該命令對(duì)應(yīng)的進(jìn)程就是前臺(tái)進(jìn)程,直到它執(zhí)行完畢或被中斷,終端窗口才會(huì)恢復(fù)可用狀態(tài)。
后臺(tái)進(jìn)程:
–在后臺(tái)運(yùn)行的進(jìn)程,不與用戶直接交互,可以在終端窗口繼續(xù)執(zhí)行其他命令的同時(shí)運(yùn)行。
–可以通過在命令末尾加上 “&” 符號(hào)來將一個(gè)進(jìn)程放入后臺(tái)運(yùn)行。例如,command &。
–后臺(tái)進(jìn)程通常用于執(zhí)行長(zhǎng)時(shí)間運(yùn)行的任務(wù),如數(shù)據(jù)備份、文件下載等,不會(huì)阻塞終端的使用。
3、守護(hù)進(jìn)程(Daemon)
定義和特點(diǎn):
–守護(hù)進(jìn)程是在后臺(tái)持續(xù)運(yùn)行的特殊進(jìn)程,通常在系統(tǒng)啟動(dòng)時(shí)自動(dòng)啟動(dòng),并一直運(yùn)行直到系統(tǒng)關(guān)閉。
–它們不與終端關(guān)聯(lián),獨(dú)立于用戶登錄和注銷,負(fù)責(zé)執(zhí)行特定的系統(tǒng)任務(wù)或提供特定的服務(wù)。
–守護(hù)進(jìn)程通常具有較高的穩(wěn)定性和可靠性,能夠在系統(tǒng)運(yùn)行過程中持續(xù)提供服務(wù),不受用戶交互的影響。
常見的守護(hù)進(jìn)程:
httpd:Web 服務(wù)器守護(hù)進(jìn)程,用于提供 HTTP 服務(wù)。
sshd:SSH 服務(wù)器守護(hù)進(jìn)程,允許遠(yuǎn)程用戶通過 SSH 協(xié)議登錄到系統(tǒng)。
crond:定時(shí)任務(wù)守護(hù)進(jìn)程,負(fù)責(zé)按照預(yù)定的時(shí)間表執(zhí)行任務(wù)。
syslogd:系統(tǒng)日志守護(hù)進(jìn)程,記錄系統(tǒng)中的各種事件和消息。
4、孤兒進(jìn)程和僵尸進(jìn)程
孤兒進(jìn)程:
–當(dāng)一個(gè)父進(jìn)程先于其子進(jìn)程結(jié)束時(shí),子進(jìn)程就成為孤兒進(jìn)程。
–孤兒進(jìn)程會(huì)被init進(jìn)程(或systemd進(jìn)程)收養(yǎng),由init進(jìn)程負(fù)責(zé)管理它們的資源和狀態(tài)。
僵尸進(jìn)程:
–當(dāng)一個(gè)子進(jìn)程結(jié)束時(shí),它的資源并不會(huì)立即被釋放,而是會(huì)保留一些狀態(tài)信息,直到父進(jìn)程讀取這些信息為止。在這個(gè)期間,子進(jìn)程就成為僵尸進(jìn)程。
–如果父進(jìn)程沒有正確地處理子進(jìn)程的結(jié)束狀態(tài),僵尸進(jìn)程可能會(huì)一直存在,占用系統(tǒng)資源。
可以使用ps或者top命令查看僵尸進(jìn)程,其狀態(tài)通常顯示為 “Z”。
進(jìn)程的屬性
進(jìn)程具有以下一些主要屬性:
1、進(jìn)程標(biāo)識(shí)符(PID)
定義:每個(gè)進(jìn)程都有唯一的進(jìn)程標(biāo)識(shí)符(Process ID,PID),用于在系統(tǒng)中標(biāo)識(shí)該進(jìn)程。
作用:操作系統(tǒng)通過 PID 來區(qū)分不同的進(jìn)程,進(jìn)行進(jìn)程管理和調(diào)度。例如,使用命令如 ps、top、kill 等時(shí),通常需要指定進(jìn)程的 PID。
2、父進(jìn)程標(biāo)識(shí)符(PPID)
定義:每個(gè)進(jìn)程都有一個(gè)父進(jìn)程,除了初始進(jìn)程(通常是 init 進(jìn)程或 systemd 進(jìn)程)。父進(jìn)程標(biāo)識(shí)符(Parent Process ID,PPID)用于標(biāo)識(shí)創(chuàng)建當(dāng)前進(jìn)程的父進(jìn)程。
作用:可以通過 PPID 來追蹤進(jìn)程的創(chuàng)建關(guān)系,了解進(jìn)程的層次結(jié)構(gòu)。在故障排除時(shí),有時(shí)可以通過查看父進(jìn)程的行為來確定子進(jìn)程出現(xiàn)問題的原因。
3、進(jìn)程狀態(tài)
運(yùn)行狀態(tài)(Running):進(jìn)程正在被 CPU 執(zhí)行。
就緒狀態(tài)(Ready):進(jìn)程已經(jīng)準(zhǔn)備好被 CPU 執(zhí)行,等待分配 CPU 時(shí)間片。
睡眠狀態(tài)(Sleeping):進(jìn)程處于等待狀態(tài),例如等待 I/O 操作完成、等待信號(hào)等。睡眠狀態(tài)又分為可中斷睡眠(Interruptible Sleep)和不可中斷睡眠(Uninterruptible Sleep)。
停止?fàn)顟B(tài)(Stopped):進(jìn)程被暫停,通常是由于接收到信號(hào),如 SIGSTOP。
僵尸狀態(tài)(Zombie):子進(jìn)程已經(jīng)結(jié)束,但父進(jìn)程還沒有回收其資源,處于僵尸狀態(tài)的進(jìn)程只保留一些退出信息,等待父進(jìn)程讀取。
4、優(yōu)先級(jí)
定義:進(jìn)程的優(yōu)先級(jí)決定了它在系統(tǒng)中獲得 CPU 時(shí)間片的機(jī)會(huì)。優(yōu)先級(jí)高的進(jìn)程會(huì)優(yōu)先被調(diào)度執(zhí)行。
調(diào)整:可以使用命令如 nice 和 renice 來調(diào)整進(jìn)程的優(yōu)先級(jí)。優(yōu)先級(jí)數(shù)值越低,優(yōu)先級(jí)越高。例如,nice -n -10 command 以較高優(yōu)先級(jí)啟動(dòng)一個(gè)命令,renice -n 5 -p PID 將進(jìn)程的優(yōu)先級(jí)調(diào)整為 5。
5、資源占用
CPU 占用:進(jìn)程在運(yùn)行時(shí)會(huì)占用 CPU 時(shí)間??梢酝ㄟ^工具如 top、htop 等查看進(jìn)程的 CPU 占用率。
內(nèi)存占用:進(jìn)程會(huì)占用一定數(shù)量的內(nèi)存空間,包括代碼、數(shù)據(jù)、棧等。同樣可以使用系統(tǒng)工具查看進(jìn)程的內(nèi)存使用情況。
文件描述符:進(jìn)程可能會(huì)打開文件、網(wǎng)絡(luò)連接等資源,這些資源通過文件描述符來表示。每個(gè)進(jìn)程都有一定數(shù)量的文件描述符可用。
6、環(huán)境變量
定義:進(jìn)程在運(yùn)行時(shí)可以訪問一組環(huán)境變量,這些變量包含了關(guān)于系統(tǒng)和用戶配置的信息。
作用:環(huán)境變量可以影響進(jìn)程的行為,例如指定程序的搜索路徑、配置數(shù)據(jù)庫連接參數(shù)等。可以通過命令 env 查看當(dāng)前進(jìn)程的環(huán)境變量,也可以在啟動(dòng)進(jìn)程時(shí)設(shè)置特定的環(huán)境變量。
7、命令行參數(shù)
定義:當(dāng)啟動(dòng)一個(gè)進(jìn)程時(shí),可以傳遞一些命令行參數(shù)給它。這些參數(shù)可以影響進(jìn)程的行為和功能。
作用:例如,一個(gè)文本編輯器可以接受文件名作為命令行參數(shù),直接打開指定的文件。命令行參數(shù)可以讓進(jìn)程更加靈活地適應(yīng)不同的使用場(chǎng)景。
父進(jìn)程和子進(jìn)程
為什么要把父進(jìn)程和子進(jìn)程單獨(dú)拿出講,因?yàn)楹苤匾?#xff0c;父進(jìn)程和子進(jìn)程是進(jìn)程關(guān)系中的重要概念。
1、父進(jìn)程與子進(jìn)程的創(chuàng)建
當(dāng)一個(gè)進(jìn)程使用特定的系統(tǒng)調(diào)用(如 fork)時(shí),它可以創(chuàng)建一個(gè)新的進(jìn)程,即子進(jìn)程。這個(gè)新創(chuàng)建的子進(jìn)程幾乎是父進(jìn)程的一個(gè)副本,包括代碼、數(shù)據(jù)、打開的文件描述符等。
例如,以下是一個(gè)使用 C 語言創(chuàng)建子進(jìn)程的示例代碼:
2、資源共享與獨(dú)立性
資源共享:
–子進(jìn)程繼承了父進(jìn)程的許多屬性,但也有一定的獨(dú)立性。子進(jìn)程會(huì)繼承父進(jìn)程打開的文件描述符,這意味著如果父進(jìn)程打開了一個(gè)文件,子進(jìn)程也可以訪問這個(gè)文件。
–然而,子進(jìn)程對(duì)文件描述符的操作(如讀取、寫入、關(guān)閉)不會(huì)影響父進(jìn)程,除非進(jìn)行了特定的同步操作。
獨(dú)立性:
–子進(jìn)程有自己的內(nèi)存空間、寄存器狀態(tài)等。雖然子進(jìn)程開始時(shí)與父進(jìn)程的內(nèi)存內(nèi)容相同,但后續(xù)的修改是獨(dú)立的。
–子進(jìn)程的運(yùn)行不會(huì)影響父進(jìn)程的執(zhí)行,除非通過特定的進(jìn)程間通信機(jī)制(如管道、信號(hào)、共享內(nèi)存等)進(jìn)行交互。
3、父子進(jìn)程的關(guān)系管理
父進(jìn)程責(zé)任:
–通常,父進(jìn)程負(fù)責(zé)創(chuàng)建和監(jiān)控子進(jìn)程。父進(jìn)程可以通過系統(tǒng)調(diào)用(如 wait 或 waitpid)等待子進(jìn)程結(jié)束,并獲取子進(jìn)程的退出狀態(tài)。
–如果父進(jìn)程沒有正確地等待子進(jìn)程結(jié)束,子進(jìn)程可能會(huì)成為僵尸進(jìn)程,占用系統(tǒng)資源。
子進(jìn)程行為:
–子進(jìn)程可以獨(dú)立地執(zhí)行自己的任務(wù)。它可以根據(jù)需要修改自己的狀態(tài)和資源,而不會(huì)直接影響父進(jìn)程。
–子進(jìn)程可以通過 exec 系列函數(shù)加載新的程序,替換自己的代碼和數(shù)據(jù),從而執(zhí)行不同的任務(wù)。
4、應(yīng)用場(chǎng)景
并發(fā)執(zhí)行任務(wù):
父進(jìn)程可以創(chuàng)建多個(gè)子進(jìn)程,讓它們同時(shí)執(zhí)行不同的任務(wù),以提高系統(tǒng)的并行性和效率。例如,在服務(wù)器應(yīng)用中,父進(jìn)程可以創(chuàng)建多個(gè)子進(jìn)程來處理客戶端請(qǐng)求。
資源管理:
父進(jìn)程可以控制子進(jìn)程的資源分配和使用。例如,父進(jìn)程可以限制子進(jìn)程的 CPU 時(shí)間、內(nèi)存使用等,以確保系統(tǒng)的穩(wěn)定性和公平性。
進(jìn)程間通信:
父子進(jìn)程可以通過特定的進(jìn)程間通信機(jī)制進(jìn)行交互,共享數(shù)據(jù)和狀態(tài)信息。例如,通過管道可以在父子進(jìn)程之間傳遞數(shù)據(jù)。
linux進(jìn)程通信(IPC,Inter - Process Communication)
在 Linux 中,進(jìn)程通信有多種方式,以下是常見的幾種:
管道(Pipe)
–定義和原理:管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動(dòng),通常用于具有親緣關(guān)系(如父子進(jìn)程)的進(jìn)程之間通信。它是基于文件描述符來實(shí)現(xiàn)的,通過內(nèi)核緩沖區(qū)來傳遞數(shù)據(jù)。
–使用方法:通過pipe()系統(tǒng)調(diào)用創(chuàng)建管道,會(huì)返回兩個(gè)文件描述符,一個(gè)用于讀,一個(gè)用于寫。例如,在父子進(jìn)程通信中,父進(jìn)程可以通過fork()創(chuàng)建子進(jìn)程后,關(guān)閉不需要的文件描述符端,然后通過write()向管道寫入數(shù)據(jù),子進(jìn)程通過read()從管道讀取數(shù)據(jù)。
命名管道(FIFO)
–定義和原理:命名管道克服了管道只能用于親緣關(guān)系進(jìn)程的限制,它是一種特殊類型的文件,在文件系統(tǒng)中有一個(gè)文件名,可以被多個(gè)無親緣關(guān)系的進(jìn)程訪問。其通信原理也是基于內(nèi)核緩沖區(qū)。
–使用方法:可以使用mkfifo()系統(tǒng)調(diào)用來創(chuàng)建命名管道。一個(gè)進(jìn)程以寫方式打開命名管道,另一個(gè)進(jìn)程以讀方式打開命名管道,這樣就可以實(shí)現(xiàn)通信。例如,進(jìn)程 A 通過open(“myfifo”, O_WRONLY)打開命名管道用于寫數(shù)據(jù),進(jìn)程 B 通過open(“myfifo”, O_RDONLY)打開用于讀數(shù)據(jù)。
消息隊(duì)列(Message Queue)
–定義和原理:消息隊(duì)列是一個(gè)由內(nèi)核維護(hù)的消息鏈表,消息被組織成一個(gè)個(gè)獨(dú)立的數(shù)據(jù)單元,每個(gè)消息有自己的類型。進(jìn)程可以向消息隊(duì)列發(fā)送消息,也可以從消息隊(duì)列接收消息,消息的發(fā)送和接收是異步的。
–使用方法:首先通過msgget()系統(tǒng)調(diào)用創(chuàng)建或獲取一個(gè)消息隊(duì)列標(biāo)識(shí)符。然后通過msgsnd()發(fā)送消息,消息是一個(gè)包含消息類型和消息內(nèi)容的結(jié)構(gòu)體。接收消息使用msgrcv(),可以根據(jù)消息類型有選擇地接收消息。
共享內(nèi)存(Shared Memory)
–定義和原理:共享內(nèi)存是最快的進(jìn)程通信方式,它允許兩個(gè)或多個(gè)進(jìn)程共享一塊內(nèi)存區(qū)域。這些進(jìn)程可以直接讀寫這塊共享內(nèi)存,就像訪問自己的內(nèi)存空間一樣,減少了數(shù)據(jù)復(fù)制的開銷。不過這種方式需要注意進(jìn)程之間的同步和互斥問題。
–使用方法:使用shmget()系統(tǒng)調(diào)用創(chuàng)建或獲取共享內(nèi)存段的標(biāo)識(shí)符。通過shmat()將共享內(nèi)存段連接到進(jìn)程的地址空間,使進(jìn)程可以訪問共享內(nèi)存。進(jìn)程使用完共享內(nèi)存后,通過shmdt()分離共享內(nèi)存段,最后通過shmctl()進(jìn)行共享內(nèi)存段的控制,如標(biāo)記為刪除等操作。
信號(hào)量(Semaphore)
–定義和原理:信號(hào)量主要用于實(shí)現(xiàn)進(jìn)程之間的同步和互斥,它是一個(gè)計(jì)數(shù)器,用于控制對(duì)共享資源的訪問。當(dāng)信號(hào)量的值大于 0 時(shí),表示資源可用;當(dāng)信號(hào)量的值等于 0 時(shí),表示資源已被占用。
–使用方法:通過semget()系統(tǒng)調(diào)用創(chuàng)建或獲取信號(hào)量集的標(biāo)識(shí)符。使用semctl()對(duì)信號(hào)量進(jìn)行初始化和控制操作。進(jìn)程在訪問共享資源之前,通過semop()操作信號(hào)量,根據(jù)信號(hào)量的值來判斷是否可以訪問資源。
信號(hào)(Signal)
定義和原理:信號(hào)是一種異步通信機(jī)制,用于通知進(jìn)程某個(gè)事件的發(fā)生。例如,當(dāng)用戶按下 Ctrl + C 時(shí),會(huì)向當(dāng)前進(jìn)程發(fā)送一個(gè)SIGINT信號(hào),進(jìn)程收到信號(hào)后可以采取相應(yīng)的措施,如終止進(jìn)程或執(zhí)行特定的信號(hào)處理函數(shù)。
使用方法:可以使用signal()或sigaction()系統(tǒng)調(diào)用來設(shè)置信號(hào)的處理函數(shù)。當(dāng)信號(hào)產(chǎn)生時(shí),內(nèi)核會(huì)中斷進(jìn)程的正常執(zhí)行流程,轉(zhuǎn)而執(zhí)行信號(hào)處理函數(shù)。
注:Linux進(jìn)程間通訊比較復(fù)雜,更深層次的介紹需要閱讀源碼來解讀,超出了本節(jié)的范疇。
進(jìn)程的管理命令
Linux的進(jìn)程管理命令有很多,限于篇幅和常用性,在次重點(diǎn)介紹最常用的三個(gè):top/ps/pstree。其他命令會(huì)在文末附上,方便大家查詢使用。
top
top命令是一個(gè)用于實(shí)時(shí)監(jiān)控系統(tǒng)進(jìn)程和資源使用情況的強(qiáng)大工具。
1、top命令的輸出內(nèi)容
啟動(dòng)top:在終端中輸入top并回車,即可啟動(dòng)top命令。它會(huì)顯示系統(tǒng)中正在運(yùn)行的進(jìn)程列表,以及系統(tǒng)的整體資源使用情況。
進(jìn)程列表信息:
PID:進(jìn)程標(biāo)識(shí)符。
USER:進(jìn)程所有者。
PR:進(jìn)程優(yōu)先級(jí)。
NI:進(jìn)程的 nice 值,用于調(diào)整優(yōu)先級(jí)。
VIRT:進(jìn)程使用的虛擬內(nèi)存大小。
RES:進(jìn)程使用的物理內(nèi)存大小。
SHR:進(jìn)程共享的內(nèi)存大小。
S:進(jìn)程狀態(tài),如R(運(yùn)行中)、S(睡眠中)、Z(僵尸狀態(tài))等。
%CPU:進(jìn)程占用的 CPU 百分比。
%MEM:進(jìn)程占用的內(nèi)存百分比。
TIME+:進(jìn)程使用的 CPU 時(shí)間。
COMMAND:啟動(dòng)進(jìn)程的命令。
系統(tǒng)資源信息:
top命令頂部顯示了系統(tǒng)的整體資源使用情況,包括:
Tasks:總進(jìn)程數(shù)、正在運(yùn)行的進(jìn)程數(shù)、睡眠中的進(jìn)程數(shù)等。
Cpu(s):CPU 使用率,包括用戶空間、系統(tǒng)空間、空閑時(shí)間等的百分比。
Mem:內(nèi)存使用情況,包括總內(nèi)存、已使用內(nèi)存、空閑內(nèi)存等。
Swap:交換空間使用情況。
2、交互操作
排序:
按P鍵可以按照 CPU 使用率對(duì)進(jìn)程列表進(jìn)行排序,從高到低顯示占用 CPU 最多的進(jìn)程。
按M鍵可以按照內(nèi)存使用率對(duì)進(jìn)程列表進(jìn)行排序。
刷新:
默認(rèn)情況下,top會(huì)定期自動(dòng)刷新顯示。也可以按空格鍵手動(dòng)刷新。
退出:
按q鍵可以退出top命令。
查看特定進(jìn)程:
在top運(yùn)行時(shí),可以輸入進(jìn)程的 PID,然后按回車鍵,即可聚焦顯示該特定進(jìn)程的信息。
切換顯示模式:
按l鍵可以切換顯示平均負(fù)載和任務(wù)數(shù)。
按t鍵可以切換顯示進(jìn)程的 CPU 時(shí)間和累計(jì)時(shí)間。
改變更新頻率:
按s鍵可以設(shè)置top的更新頻率,輸入一個(gè)數(shù)字表示更新時(shí)間間隔(以秒為單位)。
3、高級(jí)用法
命令行參數(shù):
top -b:
以批處理模式運(yùn)行top,不顯示交互界面,適合將輸出重定向到文件或其他程序進(jìn)行分析。
top -n 10:
只顯示 10 次更新,然后自動(dòng)退出。
top -d 5:
設(shè)置更新時(shí)間間隔為 5 秒。
過濾進(jìn)程:
在top運(yùn)行時(shí),可以輸入/后跟一個(gè)關(guān)鍵字,如進(jìn)程名稱或用戶名稱,來過濾顯示的進(jìn)程列表。例如,輸入/firefox可以只顯示與 Firefox 相關(guān)的進(jìn)程。
保存配置:
top的一些配置可以保存在用戶的~/.toprc文件中,以便下次啟動(dòng)時(shí)自動(dòng)應(yīng)用這些配置。例如,可以設(shè)置默認(rèn)的排序方式、更新頻率等。
PS
ps(process status)命令用于顯示當(dāng)前系統(tǒng)中的進(jìn)程狀態(tài)。
1、基本用法
顯示當(dāng)前用戶的進(jìn)程:
ps:默認(rèn)情況下,只顯示當(dāng)前用戶在當(dāng)前終端中啟動(dòng)的進(jìn)程。
顯示所有用戶的進(jìn)程:
ps -ef:
以全格式顯示系統(tǒng)中的所有進(jìn)程信息,包括進(jìn)程的用戶、PID、PPID、CPU 使用率、內(nèi)存使用情況、啟動(dòng)時(shí)間、命令等。
ps aux:
也顯示系統(tǒng)中的所有進(jìn)程信息,但輸出格式略有不同,更易讀,通常和grep及管道命令搭配使用以提高效率。
2、輸出字段解釋
UID:進(jìn)程所有者的用戶 ID。
PID:進(jìn)程標(biāo)識(shí)符。
PPID:父進(jìn)程標(biāo)識(shí)符。
C:CPU 使用率。
STIME:進(jìn)程啟動(dòng)時(shí)間。
TTY:控制終端的設(shè)備名稱。
TIME:進(jìn)程使用的 CPU 時(shí)間。
CMD:啟動(dòng)進(jìn)程的命令。
3、篩選特定進(jìn)程
根據(jù) PID 篩選:
ps -p PID:
顯示指定 PID 的進(jìn)程信息。可以指定多個(gè) PID,用逗號(hào)分隔。例如,ps -p 1234,5678。
根據(jù)進(jìn)程名稱篩選:
ps -C process_name
顯示指定名稱的進(jìn)程信息。例如,ps -C firefox顯示所有與 Firefox 相關(guān)的進(jìn)程。
根據(jù)用戶篩選:
ps -u username:
顯示指定用戶的進(jìn)程信息。例如,ps -u john顯示用戶 john 擁有的進(jìn)程。
4、輸出格式控制
自定義輸出字段:
ps -o field1,field2,...:
指定要顯示的字段。例如,ps -o pid,cmd只顯示進(jìn)程 ID 和命令。
以樹形結(jié)構(gòu)顯示進(jìn)程關(guān)系:
ps -ef --forest:
以樹形結(jié)構(gòu)顯示進(jìn)程的父子關(guān)系,更直觀地看出進(jìn)程的層次結(jié)構(gòu)。
5、高級(jí)用法
結(jié)合其他命令使用:
可以將ps的輸出作為其他命令的輸入,進(jìn)行進(jìn)一步的處理。例如,ps -ef | grep process_name可以查找特定名稱的進(jìn)程。
ps -ef | awk '{print $2}'
可以提取所有進(jìn)程的 PID。
實(shí)時(shí)監(jiān)控進(jìn)程:
watch -n 1 'ps -ef':
每 1 秒執(zhí)行一次ps -ef命令,實(shí)時(shí)監(jiān)控系統(tǒng)中的進(jìn)程變化。
按特定條件排序:
ps -ef --sort=-pcpu:
按 CPU 使用率從高到低排序顯示進(jìn)程??梢允褂貌煌呐判蜃侄?#xff0c;如-pmem按內(nèi)存使用率排序。
pstree
pstree命令用于以樹形結(jié)構(gòu)顯示進(jìn)程之間的關(guān)系。
1、基本用法
顯示所有進(jìn)程的樹形結(jié)構(gòu):
pstree:默認(rèn)情況下,以樹形結(jié)構(gòu)顯示系統(tǒng)中所有進(jìn)程的關(guān)系,每個(gè)進(jìn)程用進(jìn)程名稱表示,父進(jìn)程和子進(jìn)程之間用連線連接。
顯示特定用戶的進(jìn)程樹:
pstree -u username:顯示指定用戶的進(jìn)程樹。例如,pstree -u john顯示用戶 john 擁有的進(jìn)程及其關(guān)系。
2、輸出格式控制
顯示進(jìn)程 PID:
pstree -p:在進(jìn)程名稱后面顯示進(jìn)程的 PID。例如,init(1)-±acpid(2777)表示進(jìn)程init的 PID 是 1,acpid的 PID 是 2777。
顯示完整命令行:
pstree -a:在進(jìn)程名稱后面顯示完整的命令行參數(shù)。這對(duì)于了解進(jìn)程的具體啟動(dòng)參數(shù)很有幫助。
同時(shí)顯示 PID 和完整命令行:
pstree -ap:結(jié)合了上述兩種選項(xiàng),既顯示進(jìn)程 PID,又顯示完整命令行。
3、高級(jí)用法
過濾特定進(jìn)程:
pstree | grep process_name:
可以使用管道將pstree的輸出傳遞給grep命令,以過濾顯示特定進(jìn)程及其子進(jìn)程。例如,pstree | grep firefox顯示與 Firefox 相關(guān)的進(jìn)程樹。
以特定格式輸出:
pstree -A:以 ASCII 藝術(shù)形式顯示進(jìn)程樹,更加美觀。但這種格式可能在某些終端中顯示不完整。
pstree -G:以不同的顏色顯示不同類型的進(jìn)程,增強(qiáng)可讀性。但需要終端支持顏色顯示。
結(jié)合其他工具使用:
可以將pstree的輸出重定向到文件,以便進(jìn)一步分析。例如,pstree > process_tree.txt將進(jìn)程樹保存到文件中。
也可以在腳本中使用pstree來獲取進(jìn)程信息,進(jìn)行自動(dòng)化的系統(tǒng)管理任務(wù)。
附:進(jìn)程管理命令大全(95%以上)
進(jìn)程管理相關(guān)命令{
ps -eaf # 查看所有進(jìn)程kill -9 PID # 強(qiáng)制終止某個(gè)PID進(jìn)程kill -15 PID # 安全退出 需程序內(nèi)部處理信號(hào)cmd & # 命令后臺(tái)運(yùn)行nohup cmd & # 后臺(tái)運(yùn)行不受shell退出影響ctrl+z # 將前臺(tái)放入后臺(tái)(暫停)jobs # 查看后臺(tái)運(yùn)行程序bg 2 # 啟動(dòng)后臺(tái)暫停進(jìn)程fg 2 # 調(diào)回后臺(tái)進(jìn)程pstree # 進(jìn)程樹vmstat 1 9 # 每隔一秒報(bào)告系統(tǒng)性能信息9次sar # 查看cpu等狀態(tài)lsof file # 顯示打開指定文件的所有進(jìn)程lsof -i:32768 # 查看端口的進(jìn)程renice +1 180 # 把180號(hào)進(jìn)程的優(yōu)先級(jí)加1exec sh a.sh # 子進(jìn)程替換原來程序的pid, 避免supervisor無法強(qiáng)制殺死進(jìn)程ps{ps aux |grep -v USER | sort -nk +4 | tail # 顯示消耗內(nèi)存最多的10個(gè)運(yùn)行中的進(jìn)程,以內(nèi)存使用量排序.cpu +3# USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND%CPU # 進(jìn)程的cpu占用率%MEM # 進(jìn)程的內(nèi)存占用率VSZ # 進(jìn)程虛擬大小,單位K(即總占用內(nèi)存大小,包括真實(shí)內(nèi)存和虛擬內(nèi)存)RSS # 進(jìn)程使用的駐留集大小即實(shí)際物理內(nèi)存大小START # 進(jìn)程啟動(dòng)時(shí)間和日期占用的虛擬內(nèi)存大小 = VSZ - RSSps -eo pid,lstart,etime,args # 查看進(jìn)程啟動(dòng)時(shí)間}top{前五行是系統(tǒng)整體的統(tǒng)計(jì)信息。第一行: 任務(wù)隊(duì)列信息,同 uptime 命令的執(zhí)行結(jié)果。內(nèi)容如下:01:06:48 當(dāng)前時(shí)間up 1:22 系統(tǒng)運(yùn)行時(shí)間,格式為時(shí):分1 user 當(dāng)前登錄用戶數(shù)load average: 0.06, 0.60, 0.48 系統(tǒng)負(fù)載,即任務(wù)隊(duì)列的平均長(zhǎng)度。三個(gè)數(shù)值分別為 1分鐘、5分鐘、15分鐘前到現(xiàn)在的平均值。第二、三行:為進(jìn)程和CPU的信息。當(dāng)有多個(gè)CPU時(shí),這些內(nèi)容可能會(huì)超過兩行。內(nèi)容如下:Tasks: 29 total 進(jìn)程總數(shù)1 running 正在運(yùn)行的進(jìn)程數(shù)28 sleeping 睡眠的進(jìn)程數(shù)0 stopped 停止的進(jìn)程數(shù)0 zombie 僵尸進(jìn)程數(shù)Cpu(s): 0.3% us 用戶空間占用CPU百分比1.0% sy 內(nèi)核空間占用CPU百分比0.0% ni 用戶進(jìn)程空間內(nèi)改變過優(yōu)先級(jí)的進(jìn)程占用CPU百分比98.7% id 空閑CPU百分比0.0% wa 等待輸入輸出的CPU時(shí)間百分比0.0% hi0.0% si第四、五行:為內(nèi)存信息。內(nèi)容如下:Mem: 191272k total 物理內(nèi)存總量173656k used 使用的物理內(nèi)存總量17616k free 空閑內(nèi)存總量22052k buffers 用作內(nèi)核緩存的內(nèi)存量Swap: 192772k total 交換區(qū)總量0k used 使用的交換區(qū)總量192772k free 空閑交換區(qū)總量123988k cached 緩沖的交換區(qū)總量。內(nèi)存中的內(nèi)容被換出到交換區(qū),而后又被換入到內(nèi)存,但使用過的交換區(qū)尚未被覆蓋,該數(shù)值即為這些內(nèi)容已存在于內(nèi)存中的交換區(qū)的大小。相應(yīng)的內(nèi)存再次被換出時(shí)可不必再對(duì)交換區(qū)寫入。進(jìn)程信息區(qū),各列的含義如下: # 顯示各個(gè)進(jìn)程的詳細(xì)信息序號(hào) 列名 含義a PID 進(jìn)程idb PPID 父進(jìn)程idc RUSER Real user named UID 進(jìn)程所有者的用戶ide USER 進(jìn)程所有者的用戶名f GROUP 進(jìn)程所有者的組名g TTY 啟動(dòng)進(jìn)程的終端名。不是從終端啟動(dòng)的進(jìn)程則顯示為 ?h PR 優(yōu)先級(jí)i NI nice值。負(fù)值表示高優(yōu)先級(jí),正值表示低優(yōu)先級(jí)j P 最后使用的CPU,僅在多CPU環(huán)境下有意義k %CPU 上次更新到現(xiàn)在的CPU時(shí)間占用百分比l TIME 進(jìn)程使用的CPU時(shí)間總計(jì),單位秒m TIME+ 進(jìn)程使用的CPU時(shí)間總計(jì),單位1/100秒n %MEM 進(jìn)程使用的物理內(nèi)存百分比o VIRT 進(jìn)程使用的虛擬內(nèi)存總量,單位kb。VIRT=SWAP+RESp SWAP 進(jìn)程使用的虛擬內(nèi)存中,被換出的大小,單位kb。q RES 進(jìn)程使用的、未被換出的物理內(nèi)存大小,單位kb。RES=CODE+DATAr CODE 可執(zhí)行代碼占用的物理內(nèi)存大小,單位kbs DATA 可執(zhí)行代碼以外的部分(數(shù)據(jù)段+棧)占用的物理內(nèi)存大小,單位kbt SHR 共享內(nèi)存大小,單位kbu nFLT 頁面錯(cuò)誤次數(shù)v nDRT 最后一次寫入到現(xiàn)在,被修改過的頁面數(shù)。w S 進(jìn)程狀態(tài)。D=不可中斷的睡眠狀態(tài)R=運(yùn)行S=睡眠T=跟蹤/停止Z=僵尸進(jìn)程 父進(jìn)程在但并不等待子進(jìn)程x COMMAND 命令名/命令行y WCHAN 若該進(jìn)程在睡眠,則顯示睡眠中的系統(tǒng)函數(shù)名z Flags 任務(wù)標(biāo)志,參考 sched.h}列出正在占用swap的進(jìn)程{#!/bin/bashecho -e "PID\t\tSwap\t\tProc_Name"# 拿出/proc目錄下所有以數(shù)字為名的目錄(進(jìn)程名是數(shù)字才是進(jìn)程,其他如sys,net等存放的是其他信息)for pid in `ls -l /proc | grep ^d | awk '{ print $9 }'| grep -v [^0-9]`do# 讓進(jìn)程釋放swap的方法只有一個(gè):就是重啟該進(jìn)程?;蛘叩绕渥詣?dòng)釋放。放# 如果進(jìn)程會(huì)自動(dòng)釋放,那么我們就不會(huì)寫腳本來找他了,找他都是因?yàn)樗麤]有自動(dòng)釋放。# 所以我們要列出占用swap并需要重啟的進(jìn)程,但是init這個(gè)進(jìn)程是系統(tǒng)里所有進(jìn)程的祖先進(jìn)程# 重啟init進(jìn)程意味著重啟系統(tǒng),這是萬萬不可以的,所以就不必檢測(cè)他了,以免對(duì)系統(tǒng)造成影響。if [ $pid -eq 1 ];then continue;figrep -q "Swap" /proc/$pid/smaps 2>/dev/nullif [ $? -eq 0 ];thenswap=$(grep Swap /proc/$pid/smaps \| gawk '{ sum+=$2;} END{ print sum }')proc_name=$(ps aux | grep -w "$pid" | grep -v grep \| awk '{ for(i=11;i<=NF;i++){ printf("%s ",$i); }}')if [ $swap -gt 0 ];thenecho -e "${pid}\t${swap}\t${proc_name}"fifidone | sort -k2 -n | awk -F'\t' '{pid[NR]=$1;size[NR]=$2;name[NR]=$3;}END{for(id=1;id<=length(pid);id++){if(size[id]<1024)printf("%-10s\t%15sKB\t%s\n",pid[id],size[id],name[id]);else if(size[id]<1048576)printf("%-10s\t%15.2fMB\t%s\n",pid[id],size[id]/1024,name[id]);elseprintf("%-10s\t%15.2fGB\t%s\n",pid[id],size[id]/1048576,name[id]);}}'}linux操作系統(tǒng)提供的信號(hào){kill -l # 查看linux提供的信號(hào)trap "echo aaa" 2 3 15 # shell使用 trap 捕捉退出信號(hào)# 發(fā)送信號(hào)一般有兩種原因:# 1(被動(dòng)式) 內(nèi)核檢測(cè)到一個(gè)系統(tǒng)事件.例如子進(jìn)程退出會(huì)像父進(jìn)程發(fā)送SIGCHLD信號(hào).鍵盤按下control+c會(huì)發(fā)送SIGINT信號(hào)# 2(主動(dòng)式) 通過系統(tǒng)調(diào)用kill來向指定進(jìn)程發(fā)送信號(hào)# 進(jìn)程結(jié)束信號(hào) SIGTERM 和 SIGKILL 的區(qū)別: SIGTERM 比較友好,進(jìn)程能捕捉這個(gè)信號(hào),根據(jù)您的需要來關(guān)閉程序。在關(guān)閉程序之前,您可以結(jié)束打開的記錄文件和完成正在做的任務(wù)。在某些情況下,假如進(jìn)程正在進(jìn)行作業(yè)而且不能中斷,那么進(jìn)程可以忽略這個(gè)SIGTERM信號(hào)。# 如果一個(gè)進(jìn)程收到一個(gè)SIGUSR1信號(hào),然后執(zhí)行信號(hào)綁定函數(shù),第二個(gè)SIGUSR2信號(hào)又來了,第一個(gè)信號(hào)沒有被處理完畢的話,第二個(gè)信號(hào)就會(huì)丟棄。SIGHUP 1 A # 終端掛起或者控制進(jìn)程終止SIGINT 2 A # 鍵盤終端進(jìn)程(如control+c)SIGQUIT 3 C # 鍵盤的退出鍵被按下SIGILL 4 C # 非法指令SIGABRT 6 C # 由abort(3)發(fā)出的退出指令SIGFPE 8 C # 浮點(diǎn)異常SIGKILL 9 AEF # Kill信號(hào) 立刻停止SIGSEGV 11 C # 無效的內(nèi)存引用SIGPIPE 13 A # 管道破裂: 寫一個(gè)沒有讀端口的管道SIGALRM 14 A # 鬧鐘信號(hào) 由alarm(2)發(fā)出的信號(hào)SIGTERM 15 A # 終止信號(hào),可讓程序安全退出 kill -15SIGUSR1 30,10,16 A # 用戶自定義信號(hào)1SIGUSR2 31,12,17 A # 用戶自定義信號(hào)2SIGCHLD 20,17,18 B # 子進(jìn)程結(jié)束自動(dòng)向父進(jìn)程發(fā)送SIGCHLD信號(hào)SIGCONT 19,18,25 # 進(jìn)程繼續(xù)(曾被停止的進(jìn)程)SIGSTOP 17,19,23 DEF # 終止進(jìn)程SIGTSTP 18,20,24 D # 控制終端(tty)上按下停止鍵SIGTTIN 21,21,26 D # 后臺(tái)進(jìn)程企圖從控制終端讀SIGTTOU 22,22,27 D # 后臺(tái)進(jìn)程企圖從控制終端寫缺省處理動(dòng)作一項(xiàng)中的字母含義如下:A 缺省的動(dòng)作是終止進(jìn)程B 缺省的動(dòng)作是忽略此信號(hào),將該信號(hào)丟棄,不做處理C 缺省的動(dòng)作是終止進(jìn)程并進(jìn)行內(nèi)核映像轉(zhuǎn)儲(chǔ)(dump core),內(nèi)核映像轉(zhuǎn)儲(chǔ)是指將進(jìn)程數(shù)據(jù)在內(nèi)存的映像和進(jìn)程在內(nèi)核結(jié)構(gòu)中的部分內(nèi)容以一定格式轉(zhuǎn)儲(chǔ)到文件系統(tǒng),并且進(jìn)程退出執(zhí)行,這樣做的好處是為程序員提供了方便,使得他們可以得到進(jìn)程當(dāng)時(shí)執(zhí)行時(shí)的數(shù)據(jù)值,允許他們確定轉(zhuǎn)儲(chǔ)的原因,并且可以調(diào)試他們的程序。D 缺省的動(dòng)作是停止進(jìn)程,進(jìn)入停止?fàn)顩r以后還能重新進(jìn)行下去,一般是在調(diào)試的過程中(例如ptrace系統(tǒng)調(diào)用)E 信號(hào)不能被捕獲F 信號(hào)不能被忽略}
本篇完結(jié)。
碼字不易,寶貴經(jīng)驗(yàn)分享不易,請(qǐng)各位支持原創(chuàng),轉(zhuǎn)載注明出處,多多關(guān)注作者。