關於 Linux 程式你所需要知道的一切
| 2017-04-27 09:30 評論: 4 收藏: 5
在這篇指南中,我們會逐步對程式做基本的瞭解,然後簡要看看如何用特定命令管理 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
相關文章
- 關於 Android 程式保活,你所需要知道的一切Android
- [譯] 關於 Yarn 和 npm 你所需要知道的一切YarnNPM
- [譯] 關於 Flutter 頁面路由過渡動畫,你所需要知道的一切Flutter路由動畫
- 關於字元編碼,你所需要知道的字元
- [譯]關於 Parcel 你所需要知道的一切:快速的 Web 應用打包工具Web
- 你需要知道的關於 Go 包的一切Go
- [譯] 關於 `ExpressionChangedAfterItHasBeenCheckedError` 錯誤你所需要知道的事情ExpressError
- 關於Android的.so檔案你所需要知道的Android
- 關於Vue v-model你需要知道的一切Vue
- 關於 v-model 你需要知道的這一切!
- 關於客戶旅程地圖:你需要知道的一切地圖
- Android Fragment完全解析,關於碎片你所需知道的一切AndroidFragment
- [譯] 關於 Angular 的變化檢測,你需要知道的一切Angular
- 建立 Android Library 所需要知道的一切Android
- 關於在Android中使用CMake你所需要了解的一切(一)Android
- 關於在Android中使用CMake你所需要了解的一切(二)Android
- 關於在Android中使用CMake你所需要了解的一切(三)Android
- Android Service完全解析,關於服務你所需知道的一切(上)Android
- Android Service完全解析,關於服務你所需知道的一切(下)-程式間通訊Android
- 在 Node.js 中引入模組:你所需要知道的一切都在這裡Node.js
- [譯]GraphQL:你需要知道的一切
- 關於跨域你需要知道的跨域
- 關於實現一個Node.js靜態伺服器你所需要知道的ALLNode.js伺服器
- 基礎設施即程式碼:你需要知道的一切
- 關於CSS Transition,你需要知道的事CSS
- 關於MongoDB你需要知道的幾件事MongoDB
- 啟動物聯網專案所需的一切:關於流處理
- Flutter關於TextField你能知道的一切Flutter
- 關於字元編碼,你所需要知道的(ASCII,Unicode,Utf-8,GB2312…)字元ASCIIUnicode
- GitHub Copilot:你需要知道的一切 - RawatGithub
- 理解Flexbox:你需要知道的一切Flex
- 關於Flutter你要知道的可能都在這兒Flutter
- 關於Http協議,你必須要知道的HTTP協議
- 關於Android模組化你需要知道的Android
- [譯]有關Kotlin型別別名(typealias)你需要知道的一切Kotlin型別
- MVVM 開發總結 —— Vue 元件(你所需要知道的)MVVMVue元件
- MVVM開發總結——vue元件(你所需要知道的)MVVMVue元件
- [譯] Node.js 流: 你需要知道的一切Node.js