關於 Linux 進程你所需要知道的一切
進程的類型
在 Linux 中主要有兩種類型的進程:
- 前台進程(也稱為互動式進程) - 這些進程由終端會話初始化和控制。換句話說,需要有一個連接到系統中的用戶來啟動這樣的進程;它們不是作為系統功能/服務的一部分自動啟動。
- 後台進程(也稱為非互動式/自動進程) - 這些進程沒有連接到終端;它們不需要任何用戶輸入。
什麼是 守護進程
這是後台進程的特殊類型,它們在系統啟動時啟動,並作為服務一直運行;它們不會死亡。它們自發地作為系統任務啟動(作為服務運行)。但是,它們能被用戶通過 init 進程式控制制。
Linux 進程狀態
在 Linux 中創建進程
當現有的進程在內存中完全拷貝一份自身的時候就會創建出一個新的進程。子進程會有和父進程一樣的環境,只有進程 ID 不同。
在 Linx 中有兩種常規方式創建進程:
- 使用 system() 函數 - 這個方法相對簡單,但是比較低效而且具有明顯的安全隱患。
- 使用 fork() 和 exec() 函數 - 這個技巧比較高級但提供更好的靈活性、速度以及安全性。
Linux 如何識別進程?
由於 Linux 是一個多用戶系統,意味著不同的用戶可以在系統上運行各種各樣的程序,內核必須唯一標識程序運行的每個實例。
程序由它的進程 ID(PID)和它父進程的進程 ID(PPID)識別,因此進程可以被分類為:
- 父進程 - 這些是在運行時創建其它進程的進程。
- 子進程 - 這些是在運行時由其它進程創建的進程。
init 進程
init 進程是系統中所有進程的父進程,它是啟動 Linux 系統後第一個運行的程序;它管理著系統上的所有其它進程。它由內核自身啟動,因此理論上說它沒有父進程。
init 進程的進程 ID 總是為 1。它是所有孤兒進程的收養父母。(它會收養所有孤兒進程)。
查找進程 ID
你可以用 pidof 命令查找某個進程的進程 ID:
# pidof systemd
# pidof top
# pidof httpd
查找 Linux 進程 ID
要查找當前 shell 的進程 ID 以及它父進程的進程 ID,可以運行:
$ echo $$
$ echo $PPID
查找 Linux 父進程 ID
在 Linux 中啟動進程
每次你運行一個命令或程序(例如 cloudcmd - CloudCommander),它就會在系統中啟動一個進程。你可以按照下面的方式啟動一個前台(互動式)進程,它會被連接到終端,用戶可以發送輸入給它:
# cloudcmd
啟動 Linux 交互進程
Linux 後台任務
要在後台(非互動式)啟動一個進程,使用 &
符號,此時,該進程不會從用戶中讀取輸入,直到它被移到前台。
# cloudcmd &
# jobs
在後台啟動 Linux 進程
你也可以使用 Ctrl + Z
暫停執行一個程序並把它發送到後台,它會給進程發送 SIGSTOP 信號,從而暫停它的執行;它就會變為空閑:
# tar -cf backup.tar /backups/* ### 按下 Ctrl+Z
# jobs
要在後台繼續運行上面被暫停的命令,使用 bg
命令:
# bg
要把後台進程發送到前台,使用 fg
命令以及任務的 ID,類似:
# jobs
# fg %1
Linux 後台進程任務
你也可能想要閱讀:如何在後台啟動 Linux 命令以及在終端分離(Detach)進程
Linux 中進程的狀態
在執行過程中,取決於它的環境一個進程會從一個狀態轉變到另一個狀態。在 Linux 中,一個進程有下面的可能狀態:
- Running - 此時它正在運行(它是系統中的當前進程)或準備運行(它正在等待分配 CPU 單元)。
- Waiting - 在這個狀態,進程正在等待某個事件的發生或者系統資源。另外,內核也會區分兩種不同類型的等待進程; 可中斷等待進程 - 可以被信號中斷,以及 不可中斷等待進程 - 正在等待硬體條件,不能被任何事件/信號中斷。
- Stopped - 在這個狀態,進程已經被停止了,通常是由於收到了一個信號。例如,正在被調試的進程。
- Zombie - 該進程已經死亡,它已經停止了但是 進程表 中仍然有它的條目。
如何在 Linux 中查看活躍進程
有很多 Linux 工具可以用於查看/列出系統中正在運行的進程,兩個傳統眾所周知的是 ps 和 top 命令:
1. ps 命令
它顯示被選中的系統中活躍進程的信息,如下圖所示:
# ps
# ps -e | head
列出 Linux 活躍進程
2. top - 系統監控工具
top 是一個強大的工具,它能給你提供 運行系統的動態實時視圖,如下面截圖所示:
# top
列出 Linux 正在運行的程序
閱讀這篇文章獲取更多 top 使用事例:Linux 中 12 個 top 命令實例
3. glances - 系統監控工具
glances 是一個相對比較新的系統監控工具,它有一些比較高級的功能:
# glances
Glances – Linux 進程監控
要獲取完整使用指南,請閱讀:Glances - Linux 的一個高級實時系統監控工具
還有很多你可以用來列出活躍進程的其它有用的 Linux 系統監視工具,打開下面的鏈接了解更多關於它們的信息:
如何在 Linux 中控制進程
Linux 也有一些命令用於控制進程,例如 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 進程
想要深入了解如何使用這些命令,在 Linux 中殺死/終止活躍進程,可以點擊下面的鏈接:
注意當你系統 僵死 時你可以使用它們殺死 Linux 中的不響應程序。
給進程發送信號
Linux 中控制進程的基本方法是給它們發送信號。你可以發送很多信號給一個進程,運行下面的命令可以查看所有信號:
$ kill -l
列出所有 Linux 信號
要給一個進程發送信號,可以使用我們之前提到的 kill
、pkill
或 pgrep
命令。但只有被編程為能識別這些信號時程序才能響應這些信號。
大部分信號都是系統內部使用,或者給程序員編寫代碼時使用。下面是一些對系統用戶非常有用的信號:
- SIGHUP 1 - 當控制它的終端被被關閉時給進程發送該信號。
- SIGINT 2 - 當用戶使用
Ctrl+C
中斷進程時控制它的終端給進程發送這個信號。 - SIGQUIT 3 - 當用戶發送退出信號
Ctrl+D
時給進程發送該信號。 - SIGKILL 9 - 這個信號會馬上中斷(殺死)進程,進程不會進行清理操作。
- SIGTERM 15 - 這是一個程序終止信號(kill 默認發送這個信號)。
- SIGTSTP 20 - 它的控制終端發送這個信號給進程要求它停止(終端停止);通過用戶按
Ctrl+Z
觸發。
下面是當 Firefox 應用程序僵死時通過它的 PID 殺死它的 kill 命令事例:
$ pidof firefox
$ kill 9 2687
或
$ kill -KILL 2687
或
$ kill -SIGKILL 2687
使用它的名稱殺死應用,可以像下面這樣使用 pkill 或 killall:
$ pkill firefox
$ killall firefox
更改 Linux 進程優先順序
在 Linux 系統中,所有活躍進程都有一個優先順序以及 nice 值。有比點優先順序進程有更高優先順序的進程一般會獲得更多的 CPU 時間。
但是,有 root 許可權的系統用戶可以使用 nice
和 renice
命令影響(更改)優先順序。
在 top 命令的輸出中, NI 顯示了進程的 nice 值:
$ top
列出 Linux 正在運行的進程
使用 nice
命令為一個進程設置 nice 值。記住一個普通用戶可以給他擁有的進程設置 0 到 20 的 nice 值。
只有 root 用戶可以使用負的 nice 值。
要重新設置一個進程的優先順序,像下面這樣使用 renice
命令:
$ renice +8 2687
$ renice +8 2103
閱讀我們其它如何管理和控制 Linux 進程的有用文章。
- Linux 進程管理:啟動、停止以及中間過程
- 使用 『top』 命令 Batch 模式查找內存使用最高的 15 個進程
- 在 Linux 中查找內存和 CPU 使用率最高的進程
- 在 Linux 中如何使用進程 ID 查找進程名稱
就是這些!如果你有任何問題或者想法,通過下面的反饋框和我們分享吧。
(題圖:Pixabay,CC0)
作者簡介:
Aaron Kili 是一個 Linux 和 F.O.S.S(Free and Open-Source Software) 愛好者,一個 Linux 系統管理員、web 開發員,現在也是 TecMint 的內容創建者,他喜歡和電腦一起工作,他相信知識共享。
via: http://www.tecmint.com/linux-process-management/
作者:Aaron Kili 譯者:ictlyh 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive