關於 Linux 程序你所需要知道的一切
程序process是指正在執行的程式;是程式正在執行的一個例項。它由程式指令,和從檔案、其它程式中讀取的資料或系統使用者的輸入組成。
程序的型別
在 Linux 中主要有兩種型別的程序:
- 前臺程序(也稱為互動式程序) – 這些程序由終端會話初始化和控制。換句話說,需要有一個連線到系統中的使用者來啟動這樣的程序;它們不是作為系統功能/服務的一部分自動啟動。
- 後臺程序(也稱為非互動式/自動程序) – 這些程序沒有連線到終端;它們不需要任何使用者輸入。
什麼是守護程序daemon
這是後臺程序的特殊型別,它們在系統啟動時啟動,並作為服務一直執行;它們不會死亡。它們自發地作為系統任務啟動(作為服務執行)。但是,它們能被使用者通過 init 程序控制。
Linux 程序狀態
在 Linux 中建立程序
(LCTT 譯註:此節原文不確,根據譯者理解重新提供)
在 Linux 中建立程序有三種方式:
fork() 方式
使用 fork() 函式以父程序為藍本複製一個程序,其 PID號與父程序 PID 號不同。在 Linux 環境下,fork() 是以寫複製實現的,新的子程序的環境和父程序一樣,只有記憶體與父程序不同,其他與父程序共享,只有在父程序或者子程序進行了修改後,才重新生成一份。
system() 方式
system() 函式會呼叫 /bin/sh –c command
來執行特定的命令,並且阻塞當前程序的執行,直到 command 命令執行完畢。新的子程序會有新的 PID。
exec() 方式
exec() 方式有若干種不同的函式,與之前的 fork() 和 system() 函式不同,exec() 方式會用新程序代替原有的程序,系統會從新的程序執行,新的程序的 PID 值會與原來的程序的 PID 值相同。
Linux 如何識別程序?
由於 Linux 是一個多使用者系統,意味著不同的使用者可以在系統上執行各種各樣的程式,核心必須唯一標識程式執行的每個例項。
程式由它的程序 ID(PID)和它父程序的程序 ID(PPID)識別,因此程序可以被分類為:
- 父程序 – 這些是在執行時建立其它程序的程序。
- 子程序 – 這些是在執行時由其它程序建立的程序。
init 程序
init 程序是系統中所有程序的父程序,它是啟動 Linux 系統後第一個執行的程式;它管理著系統上的所有其它程序。它由核心自身啟動,因此理論上說它沒有父程序。
init 程序的程序 ID 總是為 1。它是所有孤兒程序的收養父母。(它會收養所有孤兒程序)。
查詢程序 ID
你可以用 pidof 命令查詢某個程序的程序 ID:
1234 | # pidof systemd# pidof top# pidof httpd |
查詢 Linux 程序 ID
要查詢當前 shell 的程序 ID 以及它父程序的程序 ID,可以執行:
123 | $echo$$$echo$PPID |
查詢 Linux 父程序 ID
在 Linux 中啟動程序
每次你執行一個命令或程式(例如 cloudcmd – CloudCommander),它就會在系統中啟動一個程序。你可以按照下面的方式啟動一個前臺(互動式)程序,它會被連線到終端,使用者可以傳送輸入給它:
12 | # cloudcmd |
啟動 Linux 互動程序
Linux 後臺任務
要在後臺(非互動式)啟動一個程序,使用 &
符號,此時,該程序不會從使用者中讀取輸入,直到它被移到前臺。
123 | # cloudcmd &# jobs |
在後臺啟動 Linux 程序
你也可以使用 Ctrl + Z
暫停執行一個程式並把它傳送到後臺,它會給程序傳送 SIGSTOP 訊號,從而暫停它的執行;它就會變為空閒:
123 | # tar -cf backup.tar /backups/* ### 按下 Ctrl+Z# jobs |
要在後臺繼續執行上面被暫停的命令,使用 bg
命令:
12 | # bg |
要把後臺程序傳送到前臺,使用 fg
命令以及任務的 ID,類似:
123 | # jobs# fg %1 |
Linux 後臺程序任務
Linux 中程序的狀態
在執行過程中,取決於它的環境一個程序會從一個狀態轉變到另一個狀態。在 Linux 中,一個程序有下面的可能狀態:
- Running – 此時它正在執行(它是系統中的當前程序)或準備執行(它正在等待分配 CPU 單元)。
- Waiting – 在這個狀態,程序正在等待某個事件的發生或者系統資源。另外,核心也會區分兩種不同型別的等待程序;可中斷等待程序interruptible waiting processes – 可以被訊號中斷,以及不可中斷等待程序uninterruptible waiting processes- 正在等待硬體條件,不能被任何事件/訊號中斷。
- Stopped – 在這個狀態,程序已經被停止了,通常是由於收到了一個訊號。例如,正在被除錯的程序。
- Zombie – 該程序已經死亡,它已經停止了但是程序表process table中仍然有它的條目。
如何在 Linux 中檢視活躍程序
有很多 Linux 工具可以用於檢視/列出系統中正在執行的程序,兩個傳統眾所周知的是 ps 和 top 命令:
1. ps 命令
它顯示被選中的系統中活躍程序的資訊,如下圖所示:
123 | # ps # ps -e | head |
列出 Linux 活躍程序
2. top – 系統監控工具
top 是一個強大的工具,它能給你提供 執行系統的動態實時檢視,如下面截圖所示:
12 | # top |
列出 Linux 正在執行的程式
3. glances – 系統監控工具
glances 是一個相對比較新的系統監控工具,它有一些比較高階的功能:
12 | # glances |
Glances – Linux 程序監控
還有很多你可以用來列出活躍程序的其它有用的 Linux 系統監視工具,開啟下面的連結瞭解更多關於它們的資訊:
如何在 Linux 中控制程序
Linux 也有一些命令用於控制程序,例如 kill
、pkill
、pgrep
和 killall
,下面是一些如何使用它們的基本事例:
1234567 | $pgrep-utecmint top$kill2308$pgrep-utecmint top$pgrep-utecmint glances$pkill glances$pgrep-utecmint glances |
控制 Linux 程序
想要深入瞭解如何使用這些命令,在 Linux 中殺死/終止活躍程序,可以點選下面的連結:
注意當你係統僵死freeze時你可以使用它們殺死 Linux 中的不響應程式。
給程序傳送訊號
Linux 中控制程序的基本方法是給它們傳送訊號。你可以傳送很多訊號給一個程序,執行下面的命令可以檢視所有訊號:
12 | $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 命令事例:
1234567 | $pidof firefox$kill92687或$kill-KILL2687或$kill-SIGKILL2687 |
使用它的名稱殺死應用,可以像下面這樣使用 pkill 或 killall:
123 | $pkill firefox$killall firefox |
更改 Linux 程序優先順序
在 Linux 系統中,所有活躍程序都有一個優先順序以及 nice 值。有比點優先順序程序有更高優先順序的程序一般會獲得更多的 CPU 時間。
但是,有 root 許可權的系統使用者可以使用 nice
和 renice
命令影響(更改)優先順序。
在 top 命令的輸出中, NI 顯示了程序的 nice 值:
12 | $top |
列出 Linux 正在執行的程序
使用 nice
命令為一個程序設定 nice 值。記住一個普通使用者可以給他擁有的程序設定 0 到 20 的 nice 值。
只有 root 使用者可以使用負的 nice 值。
要重新設定一個程序的優先順序,像下面這樣使用 renice
命令:
123 | $renice+82687$renice+82103 |
閱讀我們其它如何管理和控制 Linux 程序的有用文章。
就是這些!如果你有任何問題或者想法,通過下面的反饋框和我們分享吧。
(題圖:Pixabay,CC0)
作者簡介:
Aaron Kili 是一個 Linux 和 F.O.S.S(Free and Open-Source Software) 愛好者,一個 Linux 系統管理員、web 開發員,現在也是 TecMint 的內容建立者,他喜歡和電腦一起工作,他相信知識共享。