偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Linux操作系統(tǒng)基礎(chǔ)篇:深度解析進(jìn)程的常用命令

系統(tǒng) Linux
在 Linux 系統(tǒng)中,進(jìn)程的優(yōu)先級決定了它在競爭 CPU 資源時的優(yōu)先程度 。nice和renice命令用于調(diào)整進(jìn)程的優(yōu)先級,讓我們可以根據(jù)實際需求合理分配系統(tǒng)資源 。

在日常生活中,你是否常常一邊聽著音樂,一邊編輯文檔,還時不時切換到瀏覽器查閱資料?在計算機(jī)的世界里,Linux 系統(tǒng)也在進(jìn)行著類似的 “多任務(wù)” 操作,而這一切的背后,離不開 “進(jìn)程” 這個關(guān)鍵角色。進(jìn)程,簡單來說,就是正在運行的程序?qū)嵗?。?dāng)你在 Linux 系統(tǒng)中啟動一個程序,比如打開文本編輯器 Vim,系統(tǒng)就會為這個程序創(chuàng)建一個進(jìn)程,分配必要的資源,如內(nèi)存、CPU 時間等,讓它能夠在系統(tǒng)中 “活躍” 起來。這里要注意區(qū)分程序(Program)和進(jìn)程(Process)。

程序是存儲在磁盤上的可執(zhí)行文件,它是靜態(tài)的,就像一本寫滿指令的 “說明書”,靜靜地等待被執(zhí)行;而進(jìn)程則是程序的動態(tài)執(zhí)行過程,它有自己的生命周期,從創(chuàng)建、運行到最終結(jié)束,就像一個充滿活力的 “執(zhí)行者”,按照程序的指令在系統(tǒng)中穿梭。進(jìn)程的動態(tài)性體現(xiàn)在它會隨著程序的執(zhí)行而不斷變化狀態(tài)。在執(zhí)行過程中,進(jìn)程可能因為等待輸入輸出、獲取資源等原因暫停,也可能在得到 CPU 的調(diào)度后繼續(xù)運行 ,這種動態(tài)變化使得 Linux 系統(tǒng)能夠高效地管理和調(diào)度多個任務(wù)。

一、進(jìn)程控制塊(PCB)

在 Linux 系統(tǒng)中,進(jìn)程的管理離不開進(jìn)程控制塊(Process Control Block,簡稱 PCB),它就像是進(jìn)程的 “秘密檔案”,記錄了進(jìn)程的各種關(guān)鍵信息,是操作系統(tǒng)對進(jìn)程進(jìn)行管理和調(diào)度的重要依據(jù)。

當(dāng)一個程序被加載到內(nèi)存成為一個真正的進(jìn)程時,操作系統(tǒng)會創(chuàng)建一個 PCB 來描述它。PCB 中存儲了進(jìn)程的標(biāo)識符、狀態(tài)、優(yōu)先級、內(nèi)存指針、程序計數(shù)器、I/O 狀態(tài)信息等。以進(jìn)程標(biāo)識符(PID)來說,它是唯一標(biāo)識一個進(jìn)程的數(shù)字,就像我們每個人的身份證號碼一樣,操作系統(tǒng)通過 PID 來識別和管理不同的進(jìn)程 。進(jìn)程狀態(tài)則記錄了進(jìn)程當(dāng)前是處于運行、就緒、等待等哪種狀態(tài),以此決定進(jìn)程的調(diào)度順序。

除了這些核心字段,PCB 中還有一些其他字段也發(fā)揮著重要作用。比如優(yōu)先級字段,它決定了進(jìn)程在競爭 CPU 資源時的優(yōu)先程度,優(yōu)先級高的進(jìn)程更容易獲得 CPU 時間,從而優(yōu)先執(zhí)行;內(nèi)存指針字段,它指向進(jìn)程的代碼段、數(shù)據(jù)段和棧段,讓操作系統(tǒng)清楚進(jìn)程的內(nèi)存布局,便于進(jìn)行內(nèi)存管理 。

在 Linux 中,PCB 是通過task_struct結(jié)構(gòu)體來實現(xiàn)的。這個結(jié)構(gòu)體定義在 Linux 內(nèi)核代碼中,包含了與進(jìn)程相關(guān)的所有信息,是內(nèi)核進(jìn)行進(jìn)程管理和調(diào)度的核心。如果你對task_struct結(jié)構(gòu)體的具體內(nèi)容感興趣,可以通過查看 Linux 內(nèi)核源代碼來一探究竟 。

通過一些命令,我們可以查看進(jìn)程的相關(guān)信息,從而了解 PCB 中的部分內(nèi)容。比如使用ps -ef命令,可以查看當(dāng)前系統(tǒng)中所有進(jìn)程的詳細(xì)信息,包括進(jìn)程 ID、父進(jìn)程 ID、用戶、CPU 使用率、內(nèi)存使用率等;top命令則提供了一個交互式的進(jìn)程狀態(tài)監(jiān)視界面,能實時顯示進(jìn)程的 CPU 使用率、內(nèi)存使用率等動態(tài)信息 ,讓你對進(jìn)程的運行狀態(tài)一目了然。

二、Linux進(jìn)程的創(chuàng)建

在 Linux 系統(tǒng)中,創(chuàng)建進(jìn)程是一個常見且重要的操作,而fork()函數(shù)就是實現(xiàn)這一操作的關(guān)鍵 “魔法” 函數(shù)。

fork()函數(shù)的作用是創(chuàng)建一個子進(jìn)程,這個子進(jìn)程是父進(jìn)程的一個副本。當(dāng)fork()函數(shù)被調(diào)用時,操作系統(tǒng)會為子進(jìn)程分配一個新的進(jìn)程控制塊(PCB),并復(fù)制父進(jìn)程的大部分資源,包括代碼段、數(shù)據(jù)段、堆、棧等 。這里的復(fù)制采用了 “寫時拷貝”(Copy-On-Write,簡稱 COW)技術(shù),也就是說,在子進(jìn)程創(chuàng)建之初,父子進(jìn)程共享相同的物理內(nèi)存頁面,只有當(dāng)其中一個進(jìn)程試圖修改數(shù)據(jù)時,才會真正復(fù)制一份數(shù)據(jù)到新的物理內(nèi)存頁面,這樣可以節(jié)省內(nèi)存資源,提高創(chuàng)建進(jìn)程的效率 。

在代碼層面,fork()函數(shù)調(diào)用一次會返回兩次,在父進(jìn)程中返回子進(jìn)程的進(jìn)程 ID(PID),而在子進(jìn)程中返回 0 。通過判斷fork()函數(shù)的返回值,我們可以區(qū)分父子進(jìn)程,從而讓它們執(zhí)行不同的代碼邏輯。下面是一個簡單的示例代碼:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main() {
    pid_t pid;
    pid = fork();
    if (pid < 0) {
        // 創(chuàng)建子進(jìn)程失敗
        perror("fork error");
        return 1;
    } else if (pid == 0) {
        // 子進(jìn)程
        printf("I am the child process, my PID is %d, my parent's PID is %d\n", getpid(), getppid());
    } else {
        // 父進(jìn)程
        printf("I am the parent process, my PID is %d, and I just created a child with PID %d\n", getpid(), pid);
    }
    return 0;
}

在這個示例中,fork()函數(shù)創(chuàng)建了一個子進(jìn)程。父進(jìn)程和子進(jìn)程都會繼續(xù)執(zhí)行fork()函數(shù)之后的代碼,通過判斷pid的值,我們可以讓父子進(jìn)程分別打印出不同的信息,展示它們的身份和關(guān)系 。

在父子進(jìn)程共享代碼和數(shù)據(jù)方面,雖然它們在創(chuàng)建之初共享相同的物理內(nèi)存頁面,但這并不意味著它們的數(shù)據(jù)是完全共享的。當(dāng)其中一個進(jìn)程對數(shù)據(jù)進(jìn)行寫操作時,由于寫時拷貝機(jī)制,會為該進(jìn)程分配新的物理內(nèi)存頁面來存儲修改后的數(shù)據(jù),而不會影響另一個進(jìn)程的數(shù)據(jù) 。例如,父子進(jìn)程都有一個全局變量count,如果子進(jìn)程修改了count的值,父進(jìn)程中的count值并不會改變 ,這體現(xiàn)了進(jìn)程之間數(shù)據(jù)的獨立性。

寫時拷貝技術(shù)在進(jìn)程創(chuàng)建中有著顯著的優(yōu)勢。它避免了在進(jìn)程創(chuàng)建時對大量數(shù)據(jù)的不必要復(fù)制,大大提高了進(jìn)程創(chuàng)建的速度,減少了內(nèi)存的占用 。尤其是在創(chuàng)建大量進(jìn)程或者復(fù)制大量數(shù)據(jù)的場景下,寫時拷貝技術(shù)能夠顯著提升系統(tǒng)的性能和資源利用率 。比如在服務(wù)器應(yīng)用中,可能需要頻繁創(chuàng)建子進(jìn)程來處理客戶端的請求,使用寫時拷貝技術(shù)可以讓服務(wù)器更高效地響應(yīng)請求,減少系統(tǒng)開銷 。

除了fork()函數(shù),exec系列函數(shù)也是進(jìn)程創(chuàng)建和控制中的重要角色,它們的作用是用一個新的程序替換當(dāng)前進(jìn)程的內(nèi)存空間,包括代碼段、數(shù)據(jù)段、堆和棧等 。也就是說,當(dāng)一個進(jìn)程調(diào)用exec系列函數(shù)時,它會放棄當(dāng)前正在執(zhí)行的程序,轉(zhuǎn)而執(zhí)行一個新的程序 。

exec系列函數(shù)有多個變體,如execl、execv、execlp、execvp、execle、execvpe等 ,它們的主要區(qū)別在于參數(shù)的傳遞方式和對環(huán)境變量的處理。以execl函數(shù)為例,它的函數(shù)原型為int execl(const char *path, const char *arg, ...);,其中path是要執(zhí)行的程序的路徑,arg是傳遞給程序的參數(shù)列表,參數(shù)列表以NULL結(jié)尾 。而execlp函數(shù)的原型為int execlp(const char *file, const char *arg, ...);,它會根據(jù)環(huán)境變量PATH來查找要執(zhí)行的程序,不需要指定完整的路徑 。

在實際應(yīng)用中,fork()和exec()常常結(jié)合使用 。比如在 Shell 中,當(dāng)我們輸入一個命令時,Shell 會先調(diào)用fork()創(chuàng)建一個子進(jìn)程,然后子進(jìn)程調(diào)用exec()函數(shù)來執(zhí)行用戶輸入的命令 。這樣可以保證 Shell 進(jìn)程在執(zhí)行命令的過程中不會被阻塞,能夠繼續(xù)接受用戶的輸入 。下面是一個簡單的示例代碼,展示了fork()和exec()的結(jié)合使用:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>

int main() {
    pid_t pid;
    pid = fork();
    if (pid < 0) {
        perror("fork error");
        exit(1);
    } else if (pid == 0) {
        // 子進(jìn)程
        execlp("ls", "ls", "-l", NULL);
        // 如果exec執(zhí)行失敗,會執(zhí)行到這里
        perror("exec error");
        exit(1);
    } else {
        // 父進(jìn)程
        wait(NULL);  // 等待子進(jìn)程結(jié)束
        printf("Child process has finished.\n");
    }
    return 0;
}

在這個示例中,父進(jìn)程調(diào)用fork()創(chuàng)建子進(jìn)程,子進(jìn)程調(diào)用execlp()函數(shù)執(zhí)行l(wèi)s -l命令,列出當(dāng)前目錄下的文件列表 。如果exec執(zhí)行成功,子進(jìn)程的內(nèi)存空間會被ls程序替換,不會再返回原來的代碼;如果執(zhí)行失敗,會打印錯誤信息并退出 。父進(jìn)程通過wait(NULL)等待子進(jìn)程結(jié)束,然后打印提示信息 。

三、Linux進(jìn)程的前臺、后臺與守護(hù)進(jìn)程

在 Linux 系統(tǒng)中,進(jìn)程有著不同的 “生活方式”,其中前臺進(jìn)程、后臺進(jìn)程和守護(hù)進(jìn)程是最為常見的三種類型,它們在運行特性、與用戶交互方式以及應(yīng)用場景等方面都有著明顯的區(qū)別。

3.1 前臺進(jìn)程:與用戶直接互動的 “活躍分子”

前臺進(jìn)程是與用戶直接交互的進(jìn)程,它會獨占當(dāng)前的終端(Terminal)。當(dāng)你在終端中輸入一個命令并直接執(zhí)行,如ls -l,這就啟動了一個前臺進(jìn)程。在這個進(jìn)程運行期間,終端會被它占用,你無法在終端中輸入其他命令,直到該進(jìn)程執(zhí)行完畢或被你手動終止 。比如,當(dāng)你運行一個需要用戶不斷輸入數(shù)據(jù)的程序時,它就是前臺進(jìn)程,你必須專注于與這個進(jìn)程交互,等待它的響應(yīng) 。

3.2 后臺進(jìn)程:默默工作的 “幕后英雄”

后臺進(jìn)程則是在后臺運行的進(jìn)程,它不會占用終端的輸入輸出,你可以在啟動后臺進(jìn)程后繼續(xù)在終端中執(zhí)行其他命令 。在命令行尾加上 “&” 符號,就可以將一個命令放到后臺執(zhí)行 。例如,如果你要運行一個耗時較長的腳本test.sh,不想讓它阻塞終端,可以使用./test.sh &的方式啟動它 。

后臺進(jìn)程繼承當(dāng)前會話(Session)的標(biāo)準(zhǔn)輸出(stdout)和標(biāo)準(zhǔn)錯誤(stderr),所以它的輸出依然會同步地在命令行下顯示,但它不再繼承當(dāng)前會話的標(biāo)準(zhǔn)輸入(stdin),你無法向這個任務(wù)輸入指令 。如果你想查看當(dāng)前終端后臺運行的任務(wù),可以使用 jobs 命令;若要將后臺中的命令調(diào)至前臺繼續(xù)運行,使用 fg 命令;而 bg 命令則可以將一個在后臺暫停的命令,變成在后臺繼續(xù)執(zhí)行 。

3.3 守護(hù)進(jìn)程:系統(tǒng)穩(wěn)定運行的 “忠誠衛(wèi)士”

守護(hù)進(jìn)程(Daemon)是一種特殊的后臺進(jìn)程,它完全脫離控制終端和會話,在系統(tǒng)后臺默默地運行,不受用戶登錄和注銷的影響 。它的主要特點包括無控制終端,避免受到終端的干擾;不占用前端資源,允許正常執(zhí)行其他 bash 命令 。Linux 系統(tǒng)的大多數(shù)服務(wù)器就是用守護(hù)進(jìn)程實現(xiàn)的,比如 Internet 服務(wù)器 inetd、Web 服務(wù)器 httpd、郵件服務(wù)器 sendmail、數(shù)據(jù)庫服務(wù)器 mysqld 等 。

這些守護(hù)進(jìn)程在系統(tǒng)啟動時就開始運行,除非強(qiáng)行終止,否則會一直運行到系統(tǒng)關(guān)機(jī) 。守護(hù)進(jìn)程一般以 root 用戶權(quán)限運行,因為它們需要使用某些特殊的端口(1 - 1024)或者資源 。而且,守護(hù)進(jìn)程的父進(jìn)程一般都是 init 進(jìn)程,它是非交互式程序,沒有控制終端,所以任何輸出都需要特殊處理,通常會將標(biāo)準(zhǔn)輸入、輸出、錯誤重定向到/dev/null(黑洞文件)或者日志文件 。

為了讓進(jìn)程變成守護(hù)進(jìn)程,可以使用nohup命令,它可以在你退出帳戶 / 關(guān)閉終端之后繼續(xù)運行相應(yīng)的進(jìn)程 。例如,nohup ./test.sh > a.txt 2>&1 &,這個命令將test.sh腳本以守護(hù)進(jìn)程的方式運行,輸出重定向到a.txt文件 。也可以在代碼層面通過調(diào)用daemon函數(shù)或者手動實現(xiàn)一系列步驟,如創(chuàng)建子進(jìn)程、調(diào)用setsid創(chuàng)建新會話、改變工作目錄、重設(shè)文件權(quán)限掩碼、關(guān)閉不需要的文件描述符等 。

以 Web 服務(wù)器httpd為例,它作為守護(hù)進(jìn)程,在系統(tǒng)后臺持續(xù)運行,監(jiān)聽特定的端口(如 80 或 443),等待客戶端(如瀏覽器)的請求 。當(dāng)收到請求時,它會處理請求并返回相應(yīng)的網(wǎng)頁內(nèi)容,為用戶提供 Web 服務(wù) ,整個過程無需用戶手動干預(yù),也不會受到終端操作的影響 。再比如系統(tǒng)日志進(jìn)程syslogd,它負(fù)責(zé)記錄系統(tǒng)的各種日志信息,從系統(tǒng)啟動開始就一直默默運行,不斷地將系統(tǒng)產(chǎn)生的日志消息記錄到指定的日志文件中,為系統(tǒng)的維護(hù)和故障排查提供重要依據(jù) 。

四、Linux進(jìn)程管理常用命令

在 Linux 系統(tǒng)中,熟練掌握進(jìn)程管理命令是高效運維和開發(fā)的關(guān)鍵。這些命令就像是一把把 “瑞士軍刀”,在監(jiān)控和控制進(jìn)程時發(fā)揮著不可或缺的作用。下面,我們就來深入了解一些常用的進(jìn)程管理命令 。

4.1 ps:進(jìn)程狀態(tài)查看利器

ps(Process Status)命令用于查看當(dāng)前系統(tǒng)中運行的進(jìn)程狀態(tài),它就像是進(jìn)程世界的 “攝影師”,能為我們拍攝進(jìn)程的 “快照”,提供有關(guān)進(jìn)程的詳細(xì)信息 。

該命令將顯示進(jìn)程的詳細(xì)信息,例如進(jìn)程 ID、占用 CPU 的百分比、進(jìn)程的狀態(tài)、運行時間等等。

圖片圖片

常用選項及示例

-ef:以完整格式顯示所有進(jìn)程信息,包括用戶 ID(UID)、進(jìn)程 ID(PID)、父進(jìn)程 ID(PPID)、CPU 使用率(C)、啟動時間(STIME)、終端設(shè)備(TTY)、進(jìn)程運行所占的 CPU 時間(TIME)以及啟動該進(jìn)程的命令(CMD)等 。例如,執(zhí)行ps -ef,會得到類似如下的輸出:

UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 08:30?        00:00:01 /sbin/init
user       101     1  0 09:00 pts/0    00:00:00 bash

-aux:顯示所有用戶的進(jìn)程,包括用戶(USER)、PID、CPU 使用率(% CPU)、內(nèi)存使用率(% MEM)、虛擬內(nèi)存大小(VSZ)、常駐內(nèi)存大?。≧SS)、終端設(shè)備(TTY)、進(jìn)程狀態(tài)(STAT)、啟動時間(START)、進(jìn)程使用的 CPU 時間(TIME)以及啟動進(jìn)程的命令(COMMAND)等 。例如,ps -aux的輸出如下:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  20016  1212?        Ss   08:30   0:00:01 /sbin/init
user       101  0.1  0.5  12288  5124 pts/0    R+   09:00   0:00:00 bash
  • -ef和-aux的區(qū)別在于,-ef是 UNIX 風(fēng)格的選項,更關(guān)注進(jìn)程的關(guān)系(如 PPID 和 UID);而-aux是 BSD 風(fēng)格的選項,更側(cè)重于進(jìn)程的資源使用(如 % CPU 和 % MEM) 。
  • -C:根據(jù)命令名稱查找進(jìn)程,例如ps -C firefox,可以查找出firefox進(jìn)程的相關(guān)信息 。
  • -p:根據(jù)進(jìn)程 ID 查找進(jìn)程,如ps -p 1234,可以查看進(jìn)程 ID 為 1234 的進(jìn)程狀態(tài) 。

4.2 top:實時監(jiān)控的動態(tài)儀表盤

top命令是 Linux 系統(tǒng)中常用的實時系統(tǒng)監(jiān)控工具,它就像是一個動態(tài)的 “儀表盤”,能夠?qū)崟r展示系統(tǒng)中各個進(jìn)程的資源占用狀況,類似于 Windows 的任務(wù)管理器 。

該命令將顯示進(jìn)程的詳細(xì)信息,例如進(jìn)程 ID、占用 CPU 的百分比、進(jìn)程的狀態(tài)、運行時間等等。您還可以使用 top 命令來查看進(jìn)程的資源使用情況,例如 CPU、內(nèi)存和 I/O。

圖片圖片

主要功能和用途

  • 實時監(jiān)控:提供一個實時的、動態(tài)的視圖,展示系統(tǒng)當(dāng)前的狀態(tài),包括系統(tǒng)運行時間、登錄用戶數(shù)、平均負(fù)載等 。平均負(fù)載是指在特定時間間隔內(nèi),系統(tǒng)處于運行狀態(tài)和不可中斷狀態(tài)的平均進(jìn)程數(shù),是衡量系統(tǒng)負(fù)載的重要指標(biāo) 。
  • 進(jìn)程管理:允許用戶查看系統(tǒng)中各個進(jìn)程的運行狀態(tài),包括PID、用戶、優(yōu)先級、虛擬內(nèi)存使用量、物理內(nèi)存使用量、共享內(nèi)存量、狀態(tài)(如運行、睡眠、停止等)、CPU使用率、內(nèi)存使用率、運行時間以及命令行名稱等 。用戶可以通過交互命令對進(jìn)程進(jìn)行排序、殺死、調(diào)整優(yōu)先級等操作 。
  • 資源監(jiān)控:監(jiān)控 CPU 的總體使用率、用戶空間占用率、系統(tǒng)空間占用率等;展示物理內(nèi)存和交換空間(swap)的使用情況,包括總量、已用量、空閑量等 。

基本用法:在終端中輸入top命令并回車,即可啟動top程序。默認(rèn)情況下,它會顯示系統(tǒng)中所有進(jìn)程的列表,并按照 CPU 使用率進(jìn)行排序 。

常用選項

  • -u:僅顯示指定用戶的進(jìn)程,如top -u root,只顯示root用戶的進(jìn)程 。
  • -n:指定top命令更新的次數(shù),之后自動退出,例如top -n 5,表示更新 5 次后退出 。
  • -d:設(shè)置屏幕更新的間隔時間,默認(rèn)為 3 秒,如top -d 5,表示每 5 秒更新一次屏幕 。
  • -b:以批處理模式運行,通常與重定向結(jié)合使用,將輸出保存到文件中,例如top -b -n 1 > top_output.txt,將單次更新的數(shù)據(jù)快照保存到top_output.txt文件中 。
  • -H:以線程模式顯示,顯示每個線程的詳細(xì)信息,而非僅顯示進(jìn)程 。

交互命令:在 top 運行時,用戶可以通過一系列交互命令來改變顯示的內(nèi)容或排序方式 。例如,按P鍵以 CPU 使用率排序;按 M 鍵以內(nèi)存使用率排序;按T鍵以時間 / 累計時間排序;按 f 或 F 鍵進(jìn)入字段管理界面,允許用戶自定義顯示的字段;按k鍵殺死一個進(jìn)程,需要輸入進(jìn)程的 PID 和信號;按r鍵重新設(shè)定進(jìn)程的優(yōu)先級;按 q 鍵退出top 。

4.3 htop:更強(qiáng)大的交互式監(jiān)控工具

htop是一款強(qiáng)大的交互式系統(tǒng)監(jiān)控工具,它在top的基礎(chǔ)上進(jìn)行了增強(qiáng),提供了更直觀的界面和更豐富的操作功能 。該命令將顯示進(jìn)程的詳細(xì)信息,例如進(jìn)程 ID、占用 CPU 的百分比、進(jìn)程的狀態(tài)、運行時間等等。您可以使用 htop 命令來查看進(jìn)程的資源使用情況,例如 CPU、內(nèi)存和 I/O,并且可以使用鍵盤快捷鍵來進(jìn)行交互式操作。

圖片圖片

特點和優(yōu)勢

  • 友好的界面:使用彩色顯示,信息一目了然,支持鼠標(biāo)操作,操作更加便捷 。
  • 詳細(xì)的進(jìn)程信息:不僅顯示進(jìn)程基本信息,還展示每個進(jìn)程完整命令行,方便用戶了解進(jìn)程的具體執(zhí)行情況 。
  • 強(qiáng)大的交互功能:提供了更多的快捷鍵操作,例如按F1鍵顯示幫助頁面;按F2鍵進(jìn)入設(shè)置菜單;按F3鍵搜索進(jìn)程;按F4鍵過濾進(jìn)程;按F5鍵以樹狀視圖顯示進(jìn)程層次結(jié)構(gòu);按F6鍵選擇不同的排序方式,如按 CPU 使用率、內(nèi)存使用率等;按F7和F8鍵增加或減少進(jìn)程的nice值;按F9鍵殺死進(jìn)程;按F10鍵退出htop 。

顯示界面:htop命令顯示的界面主要由標(biāo)題欄、進(jìn)程列表、柱狀圖區(qū)域和快捷鍵提示欄四個部分組成 。標(biāo)題欄位于界面的頂部,顯示系統(tǒng)的整體狀態(tài),包括 CPU 使用率、內(nèi)存占用、進(jìn)程數(shù)等;進(jìn)程列表位于界面的主要部分,顯示當(dāng)前運行的進(jìn)程及其相關(guān)信息;柱狀圖區(qū)域位于界面的左側(cè)或右側(cè)或頂部,以柱狀圖的形式展示系統(tǒng)資源的使用情況,如 CPU 使用率、內(nèi)存占用、磁盤讀寫等;快捷鍵提示欄位于界面的底部,顯示常用的快捷鍵操作,幫助用戶快速了解和使用htop的功能 。

常用選項

  • -d:設(shè)置更新之間的延遲,例如htop -d 5,表示屏幕更新之間的延遲為 5 秒 。
  • -u:僅顯示用戶擁有的進(jìn)程,如htop -u user,只顯示user用戶的進(jìn)程 。
  • -p:僅顯示具有特定 ID 的進(jìn)程,如htop -p 1234,只顯示進(jìn)程 ID 為 1234 的進(jìn)程 。
  • -s:對給定列的進(jìn)程進(jìn)行排序,如htop -s %CPU,按 CPU 使用率對進(jìn)程進(jìn)行排序 。
  • -t:在命令列的樹視圖中顯示進(jìn)程層次結(jié)構(gòu) 。
  • --no-color:在單色模式下打開htop,禁用顏色 。

4.4 pgrep:精準(zhǔn)查找進(jìn)程 ID

pgrep是一個用于根據(jù)名稱、用戶、組和其他標(biāo)準(zhǔn)搜索進(jìn)程的實用程序,它能幫助我們快速找到匹配給定模式的運行進(jìn)程的進(jìn)程 ID(PID) 。

常用選項及示例

  • -u:查找特定用戶擁有的進(jìn)程,例如pgrep -u root,查找root用戶擁有的所有進(jìn)程 。
  • -g:查找特定組中的進(jìn)程,如pgrep -g group_name,查找屬于group_name組的進(jìn)程 。
  • -P:查找給定父 PID 的子進(jìn)程,例如pgrep -P 1234,查找父進(jìn)程 ID 為 1234 的所有子進(jìn)程 。
  • -f:與完整命令行進(jìn)行匹配(不僅僅是進(jìn)程名稱),如pgrep -f "python app.py",查找執(zhí)行python app.py命令的進(jìn)程 。
  • -l:顯示進(jìn)程名稱及其 PID,例如pgrep -l bash,輸出結(jié)果中會同時顯示進(jìn)程 ID 和進(jìn)程名稱 。
  • -o:僅返回第一個匹配的進(jìn)程,如pgrep -o firefox,只返回第一個匹配的firefox進(jìn)程的 ID 。
  • -v:反向搜索(返回與模式不匹配的進(jìn)程),例如pgrep -v -f "bash",返回所有不是執(zhí)行bash命令的進(jìn)程 。
  • -c:打印出匹配的數(shù)量,如pgrep -c java,輸出當(dāng)前系統(tǒng)中java進(jìn)程的數(shù)量 。
  • -x:完全匹配(即匹配命令的全名),例如pgrep -x sshd,只匹配進(jìn)程名為sshd的進(jìn)程,而不會匹配包含sshd的其他進(jìn)程名 。
  • -d:指定 PID 的分隔符,默認(rèn)是換行符,如pgrep ssh -d' ',輸出的多個ssh進(jìn)程 ID 之間用空格分隔 。
  • -i:匹配時不區(qū)分大小寫,例如pgrep -i FIREFOX,可以匹配到firefox進(jìn)程 。
  • -n:僅選擇最新的(最近啟動的)匹配進(jìn)程,如pgrep -n chrome,返回最近啟動的chrome進(jìn)程的 ID 。

4.5 pkill:精準(zhǔn)終止進(jìn)程

pkill命令用于根據(jù)進(jìn)程名稱或其他屬性終止進(jìn)程,它結(jié)合了pgrep和kill的功能,能夠更方便地終止符合條件的進(jìn)程 。

常用選項及示例

  • -9:強(qiáng)制殺死進(jìn)程,這是最常用的選項之一,用于終止那些難以正常結(jié)束的進(jìn)程 。例如,pkill -9 firefox,強(qiáng)制殺死所有firefox進(jìn)程 。
  • -15:默認(rèn)信號,用于正常終止進(jìn)程,嘗試讓進(jìn)程優(yōu)雅地關(guān)閉 。例如,pkill -15 apache2,正常終止所有apache2進(jìn)程 。
  • -u:指定運行用戶,例如pkill -9 -u redis redis-server,強(qiáng)制殺死redis用戶運行的redis-server進(jìn)程 。
  • -f:與完整命令行進(jìn)行匹配,如pkill -f "python app.py",終止執(zhí)行python app.py命令的進(jìn)程 。

4.6 kill:靈活的進(jìn)程信號發(fā)送

kill命令用于向進(jìn)程發(fā)送信號,它可以讓我們對進(jìn)程進(jìn)行各種控制,如終止進(jìn)程、暫停進(jìn)程、恢復(fù)進(jìn)程等 。

信號介紹:在 Linux 系統(tǒng)中,信號是一種異步事件通知機(jī)制,用于向進(jìn)程傳遞各種事件或請求 。常見的信號有:

  • SIGTERM(15):默認(rèn)的終止信號,進(jìn)程收到該信號后,會嘗試正常終止,清理資源等 。
  • SIGKILL(9):強(qiáng)制終止信號,進(jìn)程收到該信號后,會立即終止,不會進(jìn)行任何清理操作,通常用于終止那些無法正常響應(yīng)SIGTERM信號的進(jìn)程 。
  • SIGSTOP(17,19,23):暫停進(jìn)程,進(jìn)程收到該信號后,會停止運行,但不會釋放資源 。
  • SIGCONT(18,20,25):恢復(fù)被暫停的進(jìn)程,讓其繼續(xù)運行 。

使用示例

  • 要終止進(jìn)程 ID 為 1234 的進(jìn)程,可以使用kill 1234(默認(rèn)發(fā)送SIGTERM信號),如果該進(jìn)程沒有響應(yīng),可以使用kill -9 1234強(qiáng)制終止 。
  • 要暫停進(jìn)程 ID 為 5678 的進(jìn)程,可以使用kill -STOP 5678;要恢復(fù)該進(jìn)程,可以使用kill -CONT 5678 。

4.7 killall:按名稱批量終止進(jìn)程

killall命令用于根據(jù)進(jìn)程名稱終止一組進(jìn)程,它可以一次性終止所有符合條件的進(jìn)程,非常方便 。

使用示例

  • 要終止所有httpd進(jìn)程,可以使用killall httpd,它會向所有名為httpd的進(jìn)程發(fā)送SIGTERM信號,嘗試正常終止它們 。
  • 如果需要強(qiáng)制終止,可以使用killall -9 httpd,向所有httpd進(jìn)程發(fā)送SIGKILL信號 。

4.8 pgrep:強(qiáng)大的進(jìn)程查找

pgrep命令是一個強(qiáng)大的進(jìn)程查找工具,它可以根據(jù)各種條件查找進(jìn)程 。除了前面提到的選項,還可以結(jié)合正則表達(dá)式進(jìn)行更靈活的查找 。示例

  • 要查找所有命令行中包含apache的進(jìn)程,可以使用pgrep -f apache 。
  • 要查找當(dāng)前用戶運行的所有bash進(jìn)程,可以使用pgrep -u $USER bash 。

4.9 pidof:快速獲取進(jìn)程 ID

pidof命令用于快速獲取指定進(jìn)程名稱的進(jìn)程 ID,它的輸出非常簡潔,只包含進(jìn)程 ID 。

使用示例:要獲取nginx進(jìn)程的 ID,可以使用pidof nginx,如果系統(tǒng)中有多個nginx進(jìn)程,它會輸出所有進(jìn)程的 ID,以空格分隔 。

4.10 nice和renice:調(diào)整進(jìn)程優(yōu)先級

在 Linux 系統(tǒng)中,進(jìn)程的優(yōu)先級決定了它在競爭 CPU 資源時的優(yōu)先程度 。nice和renice命令用于調(diào)整進(jìn)程的優(yōu)先級,讓我們可以根據(jù)實際需求合理分配系統(tǒng)資源 。

  • nice 命令:nice命令用于以指定的優(yōu)先級啟動一個新進(jìn)程 。優(yōu)先級的范圍是 - 20(最高優(yōu)先級)到 19(最低優(yōu)先級),默認(rèn)優(yōu)先級是 0 。例如,要以較高的優(yōu)先級(-5)啟動python程序,可以使用nice -n -5 python my_script.py。這里,-n選項用于指定優(yōu)先級 。
  • renice 命令:renice命令用于調(diào)整已經(jīng)運行的進(jìn)程的優(yōu)先級 。例如,要將進(jìn)程 ID 為 1234 的進(jìn)程優(yōu)先級調(diào)整為 10,可以使用renice 10 1234 。如果要調(diào)整所有屬于user用戶的進(jìn)程優(yōu)先級為 5,可以使用renice 5 -u user 。
責(zé)任編輯:武曉燕 來源: 深度Linux
相關(guān)推薦

2011-01-06 14:22:50

2013-06-04 11:22:01

Linux常用命令

2018-11-09 09:21:55

Linux系統(tǒng)命令

2010-03-03 15:23:41

2014-08-15 10:47:49

Linux命令

2010-04-06 18:06:18

CentOS系統(tǒng)

2014-07-25 10:55:36

Linux命令

2020-10-12 01:11:35

vimLinux命令

2010-06-30 10:09:14

Linux系統(tǒng)備份

2023-12-22 15:23:04

Linux操作系統(tǒng)

2010-03-24 17:44:58

CentOS常用命令

2020-09-28 15:14:31

Linux常用命令實用命令

2014-08-18 09:49:46

Linux

2009-12-22 14:47:24

Linux常用命令

2011-03-23 11:13:36

umaskcpiomv

2014-08-13 09:29:15

linux

2020-09-22 11:00:27

Linux命令文件

2023-08-28 10:49:13

Linux系統(tǒng)

2011-01-19 17:00:09

Postfix常用命令

2014-01-02 09:57:56

PostgreSQL命令
點贊
收藏

51CTO技術(shù)棧公眾號