溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

如何用特定命令管理 Linux進(jìn)程

發(fā)布時(shí)間:2021-12-24 14:08:36 來(lái)源:億速云 閱讀:165 作者:iii 欄目:系統(tǒng)運(yùn)維

這篇文章主要講解了“如何用特定命令管理 Linux進(jìn)程”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“如何用特定命令管理 Linux進(jìn)程”吧!

進(jìn)程(process)是指正在執(zhí)行的程序;是程序正在運(yùn)行的一個(gè)實(shí)例。它由程序指令,和從文件、其它程序中讀取的數(shù)據(jù)或系統(tǒng)用戶(hù)的輸入組成。

進(jìn)程的類(lèi)型

在 Linux 中主要有兩種類(lèi)型的進(jìn)程:

  • 前臺(tái)進(jìn)程(也稱(chēng)為交互式進(jìn)程) -  這些進(jìn)程由終端會(huì)話(huà)初始化和控制。換句話(huà)說(shuō),需要有一個(gè)連接到系統(tǒng)中的用戶(hù)來(lái)啟動(dòng)這樣的進(jìn)程;它們不是作為系統(tǒng)功能/服務(wù)的一部分自動(dòng)啟動(dòng)。

  • 后臺(tái)進(jìn)程(也稱(chēng)為非交互式/自動(dòng)進(jìn)程) - 這些進(jìn)程沒(méi)有連接到終端;它們不需要任何用戶(hù)輸入。

什么是守護(hù)進(jìn)程(daemon)

這是后臺(tái)進(jìn)程的特殊類(lèi)型,它們?cè)谙到y(tǒng)啟動(dòng)時(shí)啟動(dòng),并作為服務(wù)一直運(yùn)行;它們不會(huì)死亡。它們自發(fā)地作為系統(tǒng)任務(wù)啟動(dòng)(作為服務(wù)運(yùn)行)。但是,它們能被用戶(hù)通過(guò)  init 進(jìn)程控制。

如何用特定命令管理 Linux進(jìn)程
Linux 進(jìn)程狀態(tài)

在 Linux 中創(chuàng)建進(jìn)程

(LCTT 譯注:此節(jié)原文不確,根據(jù)譯者理解重新提供)

在 Linux 中創(chuàng)建進(jìn)程有三種方式:

fork() 方式

使用 fork() 函數(shù)以父進(jìn)程為藍(lán)本復(fù)制一個(gè)進(jìn)程,其 PID號(hào)與父進(jìn)程 PID 號(hào)不同。在 Linux 環(huán)境下,fork()  是以寫(xiě)復(fù)制實(shí)現(xiàn)的,新的子進(jìn)程的環(huán)境和父進(jìn)程一樣,只有內(nèi)存與父進(jìn)程不同,其他與父進(jìn)程共享,只有在父進(jìn)程或者子進(jìn)程進(jìn)行了修改后,才重新生成一份。

system() 方式

system() 函數(shù)會(huì)調(diào)用 /bin/sh –c command 來(lái)執(zhí)行特定的命令,并且阻塞當(dāng)前進(jìn)程的執(zhí)行,直到 command  命令執(zhí)行完畢。新的子進(jìn)程會(huì)有新的 PID。

exec() 方式

exec() 方式有若干種不同的函數(shù),與之前的 fork() 和 system() 函數(shù)不同,exec()  方式會(huì)用新進(jìn)程代替原有的進(jìn)程,系統(tǒng)會(huì)從新的進(jìn)程運(yùn)行,新的進(jìn)程的 PID 值會(huì)與原來(lái)的進(jìn)程的 PID 值相同。

Linux 如何識(shí)別進(jìn)程?

由于 Linux 是一個(gè)多用戶(hù)系統(tǒng),意味著不同的用戶(hù)可以在系統(tǒng)上運(yùn)行各種各樣的程序,內(nèi)核必須***標(biāo)識(shí)程序運(yùn)行的每個(gè)實(shí)例。

程序由它的進(jìn)程 ID(PID)和它父進(jìn)程的進(jìn)程 ID(PPID)識(shí)別,因此進(jìn)程可以被分類(lèi)為:

  • 父進(jìn)程 - 這些是在運(yùn)行時(shí)創(chuàng)建其它進(jìn)程的進(jìn)程。

  • 子進(jìn)程 - 這些是在運(yùn)行時(shí)由其它進(jìn)程創(chuàng)建的進(jìn)程。

init 進(jìn)程

init 進(jìn)程是系統(tǒng)中所有進(jìn)程的父進(jìn)程,它是啟動(dòng) Linux  系統(tǒng)后***個(gè)運(yùn)行的程序;它管理著系統(tǒng)上的所有其它進(jìn)程。它由內(nèi)核自身啟動(dòng),因此理論上說(shuō)它沒(méi)有父進(jìn)程。

init 進(jìn)程的進(jìn)程 ID 總是為 1。它是所有孤兒進(jìn)程的收養(yǎng)父母。(它會(huì)收養(yǎng)所有孤兒進(jìn)程)。

查找進(jìn)程 ID

你可以用 pidof 命令查找某個(gè)進(jìn)程的進(jìn)程 ID:

# pidof systemd # pidof top # pidof httpd

 如何用特定命令管理 Linux進(jìn)程
查找 Linux 進(jìn)程 ID

要查找當(dāng)前 shell 的進(jìn)程 ID 以及它父進(jìn)程的進(jìn)程 ID,可以運(yùn)行:

$ echo $$ $ echo $PPID

 如何用特定命令管理 Linux進(jìn)程
查找 Linux 父進(jìn)程 ID

在 Linux 中啟動(dòng)進(jìn)程

每次你運(yùn)行一個(gè)命令或程序(例如 cloudcmd -  CloudCommander),它就會(huì)在系統(tǒng)中啟動(dòng)一個(gè)進(jìn)程。你可以按照下面的方式啟動(dòng)一個(gè)前臺(tái)(交互式)進(jìn)程,它會(huì)被連接到終端,用戶(hù)可以發(fā)送輸入給它:

# cloudcmd

 如何用特定命令管理 Linux進(jìn)程
啟動(dòng) Linux 交互進(jìn)程

Linux 后臺(tái)任務(wù)

要在后臺(tái)(非交互式)啟動(dòng)一個(gè)進(jìn)程,使用 & 符號(hào),此時(shí),該進(jìn)程不會(huì)從用戶(hù)中讀取輸入,直到它被移到前臺(tái)。

# cloudcmd & # jobs

 如何用特定命令管理 Linux進(jìn)程
在后臺(tái)啟動(dòng) Linux 進(jìn)程

你也可以使用 Ctrl + Z 暫停執(zhí)行一個(gè)程序并把它發(fā)送到后臺(tái),它會(huì)給進(jìn)程發(fā)送 SIGSTOP 信號(hào),從而暫停它的執(zhí)行;它就會(huì)變?yōu)榭臻e:

# tar -cf backup.tar /backups/*  ### 按下 Ctrl+Z # jobs

要在后臺(tái)繼續(xù)運(yùn)行上面被暫停的命令,使用 bg 命令:

# bg

要把后臺(tái)進(jìn)程發(fā)送到前臺(tái),使用 fg 命令以及任務(wù)的 ID,類(lèi)似:

# jobs # fg %1

 如何用特定命令管理 Linux進(jìn)程
Linux 后臺(tái)進(jìn)程任務(wù)

Linux 中進(jìn)程的狀態(tài)

在執(zhí)行過(guò)程中,取決于它的環(huán)境一個(gè)進(jìn)程會(huì)從一個(gè)狀態(tài)轉(zhuǎn)變到另一個(gè)狀態(tài)。在 Linux 中,一個(gè)進(jìn)程有下面的可能狀態(tài):

  • Running - 此時(shí)它正在運(yùn)行(它是系統(tǒng)中的當(dāng)前進(jìn)程)或準(zhǔn)備運(yùn)行(它正在等待分配 CPU 單元)。

  • Waiting -  在這個(gè)狀態(tài),進(jìn)程正在等待某個(gè)事件的發(fā)生或者系統(tǒng)資源。另外,內(nèi)核也會(huì)區(qū)分兩種不同類(lèi)型的等待進(jìn)程;可中斷等待進(jìn)程(interruptible waiting  processes) - 可以被信號(hào)中斷,以及不可中斷等待進(jìn)程(uninterruptible waiting processes)-  正在等待硬件條件,不能被任何事件/信號(hào)中斷。

  • Stopped - 在這個(gè)狀態(tài),進(jìn)程已經(jīng)被停止了,通常是由于收到了一個(gè)信號(hào)。例如,正在被調(diào)試的進(jìn)程。

  • Zombie - 該進(jìn)程已經(jīng)死亡,它已經(jīng)停止了但是進(jìn)程表(process table)中仍然有它的條目。

如何在 Linux 中查看活躍進(jìn)程

有很多 Linux 工具可以用于查看/列出系統(tǒng)中正在運(yùn)行的進(jìn)程,兩個(gè)傳統(tǒng)眾所周知的是 ps 和 top 命令:

1. ps 命令

它顯示被選中的系統(tǒng)中活躍進(jìn)程的信息,如下圖所示:

# ps  # ps -e | head

 如何用特定命令管理 Linux進(jìn)程
列出 Linux 活躍進(jìn)程

2. top - 系統(tǒng)監(jiān)控工具

top 是一個(gè)強(qiáng)大的工具,它能給你提供 運(yùn)行系統(tǒng)的動(dòng)態(tài)實(shí)時(shí)視圖,如下面截圖所示:

# top

 如何用特定命令管理 Linux進(jìn)程
列出 Linux 正在運(yùn)行的程序

3. glances - 系統(tǒng)監(jiān)控工具

glances 是一個(gè)相對(duì)比較新的系統(tǒng)監(jiān)控工具,它有一些比較高級(jí)的功能:

# glances

 如何用特定命令管理 Linux進(jìn)程
Glances – Linux 進(jìn)程監(jiān)控

還有很多你可以用來(lái)列出活躍進(jìn)程的其它有用的 Linux 系統(tǒng)監(jiān)視工具,打開(kāi)下面的鏈接了解更多關(guān)于它們的信息:

  1. 監(jiān)控 Linux 性能的 20 個(gè)命令行工具

  2. 13 個(gè)有用的 Linux 監(jiān)控工具

如何在 Linux 中控制進(jìn)程

Linux 也有一些命令用于控制進(jìn)程,例如 kill、pkill、pgrep 和 killall,下面是一些如何使用它們的基本事例:

$ pgrep -u tecmint top $ kill 2308 $ pgrep -u tecmint top $ pgrep -u tecmint glances $ pkill glances $ pgrep -u tecmint glances

 如何用特定命令管理 Linux進(jìn)程
控制 Linux 進(jìn)程

想要深入了解如何使用這些命令,在 Linux 中殺死/終止活躍進(jìn)程,可以點(diǎn)擊下面的鏈接:

  1. 終止 Linux 進(jìn)程的 Kill、Pkill 和 Killall 命令指南

  2. 如何在 Linux 中查找并殺死進(jìn)程

注意當(dāng)你系統(tǒng)僵死(freeze)時(shí)你可以使用它們殺死 Linux 中的不響應(yīng)程序。

給進(jìn)程發(fā)送信號(hào)

Linux 中控制進(jìn)程的基本方法是給它們發(fā)送信號(hào)。你可以發(fā)送很多信號(hào)給一個(gè)進(jìn)程,運(yùn)行下面的命令可以查看所有信號(hào):

$ kill -l

 如何用特定命令管理 Linux進(jìn)程
列出所有 Linux 信號(hào)

要給一個(gè)進(jìn)程發(fā)送信號(hào),可以使用我們之前提到的 kill、pkill 或 pgrep 命令。但只有被編程為能識(shí)別這些信號(hào)時(shí)程序才能響應(yīng)這些信號(hào)。

大部分信號(hào)都是系統(tǒng)內(nèi)部使用,或者給程序員編寫(xiě)代碼時(shí)使用。下面是一些對(duì)系統(tǒng)用戶(hù)非常有用的信號(hào):

  • SIGHUP 1 - 當(dāng)控制它的終端被被關(guān)閉時(shí)給進(jìn)程發(fā)送該信號(hào)。

  • SIGINT 2 - 當(dāng)用戶(hù)使用 Ctrl+C 中斷進(jìn)程時(shí)控制它的終端給進(jìn)程發(fā)送這個(gè)信號(hào)。

  • SIGQUIT 3 - 當(dāng)用戶(hù)發(fā)送退出信號(hào) Ctrl+D 時(shí)給進(jìn)程發(fā)送該信號(hào)。

  • SIGKILL 9 - 這個(gè)信號(hào)會(huì)馬上中斷(殺死)進(jìn)程,進(jìn)程不會(huì)進(jìn)行清理操作。

  • SIGTERM 15 - 這是一個(gè)程序終止信號(hào)(kill 默認(rèn)發(fā)送這個(gè)信號(hào))。

  • SIGTSTP 20 - 它的控制終端發(fā)送這個(gè)信號(hào)給進(jìn)程要求它停止(終端停止);通過(guò)用戶(hù)按 Ctrl+Z 觸發(fā)。

下面是當(dāng) Firefox 應(yīng)用程序僵死時(shí)通過(guò)它的 PID 殺死它的 kill 命令事例:

$ pidof firefox $ kill 9 2687 或 $ kill -KILL 2687 或 $ kill -SIGKILL 2687

使用它的名稱(chēng)殺死應(yīng)用,可以像下面這樣使用 pkill 或 killall:

$ pkill firefox $ killall firefox

更改 Linux 進(jìn)程優(yōu)先級(jí)

在 Linux 系統(tǒng)中,所有活躍進(jìn)程都有一個(gè)優(yōu)先級(jí)以及 nice 值。有比點(diǎn)優(yōu)先級(jí)進(jìn)程有更高優(yōu)先級(jí)的進(jìn)程一般會(huì)獲得更多的 CPU 時(shí)間。

但是,有 root 權(quán)限的系統(tǒng)用戶(hù)可以使用 nice 和 renice 命令影響(更改)優(yōu)先級(jí)。

在 top 命令的輸出中, NI 顯示了進(jìn)程的 nice 值:

$ top

 如何用特定命令管理 Linux進(jìn)程
列出 Linux 正在運(yùn)行的進(jìn)程

使用 nice 命令為一個(gè)進(jìn)程設(shè)置 nice 值。記住一個(gè)普通用戶(hù)可以給他擁有的進(jìn)程設(shè)置 0 到 20 的 nice 值。

只有 root 用戶(hù)可以使用負(fù)的 nice 值。

要重新設(shè)置一個(gè)進(jìn)程的優(yōu)先級(jí),像下面這樣使用 renice 命令:

$ renice +8 2687$ renice +8 2103

感謝各位的閱讀,以上就是“如何用特定命令管理 Linux進(jìn)程”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)如何用特定命令管理 Linux進(jìn)程這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI