在這篇指南中,我們會(huì)逐步對(duì)進(jìn)程做基本的了解,,然后簡(jiǎn)要看看如何用特定命令管理 Linux 進(jìn)程,。 -- Aaron Kili
本文導(dǎo)航
-fork() 方式 …… 11%
-system() 方式 …… 14%
-exec() 方式 …… 15%
-init 進(jìn)程 …… 20%
-查找進(jìn)程 ID …… 23%
編譯自: http://www./linux-process-management/ 作者: Aaron Kili
譯者: ictlyh
在這篇指南中,,我們會(huì)逐步對(duì)進(jìn)程做基本的了解,,然后簡(jiǎn)要看看如何用特定命令管理 Linux 進(jìn)程[1]。
進(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)程狀態(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)[2]后第一個(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)程 ID
要查找當(dāng)前 shell 的進(jìn)程 ID 以及它父進(jìn)程的進(jìn)程 ID,,可以運(yùn)行:
$ echo $$ $ echo $PPID
查找 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
啟動(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
在后臺(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 后臺(tái)進(jìn)程任務(wù)
你也可能想要閱讀:如何在后臺(tái)啟動(dòng) Linux 命令以及在終端分離(Detach)進(jìn)程[3]
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[4] 和 top[5] 命令:
1. ps 命令
它顯示被選中的系統(tǒng)中活躍進(jìn)程的信息,如下圖所示:
# ps # ps -e | head
列出 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 正在運(yùn)行的程序
閱讀這篇文章獲取更多 top 使用事例:Linux 中 12 個(gè) top 命令實(shí)例[6]
3. glances - 系統(tǒng)監(jiān)控工具
glances 是一個(gè)相對(duì)比較新的系統(tǒng)監(jiān)控工具,它有一些比較高級(jí)的功能:
# glances
Glances – Linux 進(jìn)程監(jiān)控
要獲取完整使用指南,,請(qǐng)閱讀:Glances - Linux 的一個(gè)高級(jí)實(shí)時(shí)系統(tǒng)監(jiān)控工具[7]
還有很多你可以用來(lái)列出活躍進(jìn)程的其它有用的 Linux 系統(tǒng)監(jiān)視工具,,打開(kāi)下面的鏈接了解更多關(guān)于它們的信息:
監(jiān)控 Linux 性能的 20 個(gè)命令行工具[8]
13 個(gè)有用的 Linux 監(jiān)控工具[9]
如何在 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)程,,可以點(diǎn)擊下面的鏈接:
終止 Linux 進(jìn)程的 Kill,、Pkill 和 Killall 命令指南[10]
如何在 Linux 中查找并殺死進(jìn)程[11]
注意當(dāng)你系統(tǒng)僵死freeze時(shí)你可以使用它們殺死 Linux 中的不響應(yīng)程序[12]。
給進(jìn)程發(fā)送信號(hào)
Linux 中控制進(jìn)程的基本方法是給它們發(fā)送信號(hào),。你可以發(fā)送很多信號(hào)給一個(gè)進(jìn)程,,運(yùn)行下面的命令可以查看所有信號(hào):
$ kill -l
列出所有 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 正在運(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)程的有用文章,。
Linux 進(jìn)程管理:?jiǎn)?dòng),、停止以及中間過(guò)程[13]
使用 ‘top’ 命令 Batch 模式查找內(nèi)存使用最高的 15 個(gè)進(jìn)程[14]
在 Linux 中查找內(nèi)存和 CPU 使用率最高的進(jìn)程[15]
在 Linux 中如何使用進(jìn)程 ID 查找進(jìn)程名稱(chēng)[16]
就是這些!如果你有任何問(wèn)題或者想法,通過(guò)下面的反饋框和我們分享吧,。
(題圖:Pixabay,,CC0)
作者簡(jiǎn)介:
Aaron Kili 是一個(gè) Linux 和 F.O.S.S(Free and Open-Source Software) 愛(ài)好者,一個(gè) Linux 系統(tǒng)管理員,、web 開(kāi)發(fā)員,,現(xiàn)在也是 TecMint 的內(nèi)容創(chuàng)建者,他喜歡和電腦一起工作,,他相信知識(shí)共享,。
via: http://www./linux-process-management/
作者:Aaron Kili[17] 譯者:ictlyh 校對(duì):wxy
本文由 LCTT 原創(chuàng)編譯,Linux中國(guó) 榮譽(yù)推出
[1]: 管理 Linux 進(jìn)程 - http://www./dstat-monitor-linux-server-performance-process-memory-network/
[2]: 啟動(dòng) Linux 系統(tǒng) - http://www./linux-boot-process/
[3]: 如何在后臺(tái)啟動(dòng) Linux 命令以及在終端分離(Detach)進(jìn)程 - http://www./run-linux-command-process-in-background-detach-process/
[4]: ps - /tag-ps.html
[5]: top - /tag-top.html
[6]: Linux 中 12 個(gè) top 命令實(shí)例 - http://www./12-top-command-examples-in-linux/
[7]: Glances - Linux 的一個(gè)高級(jí)實(shí)時(shí)系統(tǒng)監(jiān)控工具 - https:///article-6882-1.html
[8]: 監(jiān)控 Linux 性能的 20 個(gè)命令行工具 - http://www./command-line-tools-to-monitor-linux-performance/
[9]: 13 個(gè)有用的 Linux 監(jiān)控工具 - http://www./linux-performance-monitoring-tools/
[10]: 終止 Linux 進(jìn)程的 Kill,、Pkill 和 Killall 命令指南 - http://www./how-to-kill-a-process-in-linux/
[11]: 如何在 Linux 中查找并殺死進(jìn)程 - http://www./find-and-kill-running-processes-pid-in-linux/
[12]: Linux 中的不響應(yīng)程序 - http://www./kill-processes-unresponsive-programs-in-ubuntu/
[13]: Linux 進(jìn)程管理:?jiǎn)?dòng),、停止以及中間過(guò)程 - http://www./rhcsa-exam-boot-process-and-process-management/
[14]: 使用 ‘top’ 命令 Batch 模式查找內(nèi)存使用最高的 15 個(gè)進(jìn)程 - http://www./find-processes-by-memory-usage-top-batch-mode/
[15]: 在 Linux 中查找內(nèi)存和 CPU 使用率最高的進(jìn)程 - http://www./find-linux-processes-memory-ram-cpu-usage/
[16]: 在 Linux 中如何使用進(jìn)程 ID 查找進(jìn)程名稱(chēng) - http://www./find-process-name-pid-number-linux/
[17]: Aaron Kili - http://www./author/aaronkili/