關於 Linux 程序

2021-08-01 12:57:34 字數 3912 閱讀 7376

程序process是指正在執行的程式;是程式正在執行的乙個例項。它由程式指令,和從檔案、其它程式中讀取的資料或系統使用者的輸入組成。

在 linux 中主要有兩種型別的程序:

什麼是守護程序daemon

這是後台程序的特殊型別,它們在系統啟動時啟動,並作為服務一直執行;它們不會死亡。它們自發地作為系統任務啟動(作為服務執行)。但是,它們能被使用者通過 init 程序控制。

(lctt 譯註:此節原文不確,根據譯者理解重新提供)

在 linux 中建立程序有三種方式:

fork() 方式

使用 fork() 函式以父程序為藍本複製乙個程序,其 pid號與父程序 pid 號不同。在 linux 環境下,fork() 是以寫複製實現的,新的子程序的環境和父程序一樣,只有記憶體與父程序不同,其他與父程序共享,只有在父程序或者子程序進行了修改後,才重新生成乙份。

system() 方式

system() 函式會呼叫 /bin/sh –c command 來執行特定的命令,並且阻塞當前程序的執行,直到 command 命令執行完畢。新的子程序會有新的 pid。

exec() 方式

exec() 方式有若干種不同的函式,與之前的 fork() 和 system() 函式不同,exec() 方式會用新程序代替原有的程序,系統會從新的程序執行,新的程序的 pid 值會與原來的程序的 pid 值相同。

由於 linux 是乙個多使用者系統,意味著不同的使用者可以在系統上執行各種各樣的程式,核心必須唯一標識程式執行的每個例項。

程式由它的程序 id(pid)和它父程序的程序 id(ppid)識別,因此程序可以被分類為:

init 程序

init 程序是系統中所有程序的父程序,它是啟動 linux 系統後第乙個執行的程式;它管理著系統上的所有其它程序。它由核心自身啟動,因此理論上說它沒有父程序。

init 程序的程序 id 總是為 1。它是所有孤兒程序的收養父母。(它會收養所有孤兒程序)。

查詢程序 id

你可以用 pidof 命令查詢某個程序的程序 id:

要查詢當前 shell 的程序 id 以及它父程序的程序 id,可以執行:

$ echo $$

$ echo $ppid

每次你執行乙個命令或程式(例如 cloudcmd – cloudcommander),它就會在系統中啟動乙個程序。你可以按照下面的方式啟動乙個前台(互動式)程序,它會被連線到終端,使用者可以傳送輸入給它:

# cloudcmd

linux 後台任務

要在後台(非互動式)啟動乙個程序,使用 & 符號,此時,該程序不會從使用者中讀取輸入,直到它被移到前台。

# cloudcmd &

# jobs

你也可以使用 ctrl + z 暫停執行乙個程式並把它傳送到後台,它會給程序傳送 sigstop 訊號,從而暫停它的執行;它就會變為空閒:

# tar -cf backup.tar /backups/*  ### 按下 ctrl+z

# jobs

要在後台繼續執行上面被暫停的命令,使用 bg 命令:

# bg

要把後台程序傳送到前台,使用 fg 命令以及任務的 id,類似:

# jobs

# fg %1

你也可能想要閱讀:如何在後台啟動 linux 命令以及在終端分離(detach)程序

在執行過程中,取決於它的環境乙個程序會從乙個狀態轉變到另乙個狀態。在 linux 中,乙個程序有下面的可能狀態:

有很多 linux 工具可以用於檢視/列出系統中正在執行的程序,兩個傳統眾所周知的是 ps 和 top 命令:

1. ps 命令

它顯示被選中的系統中活躍程序的資訊:

# ps

# ps -e | head

2. top – 系統監控工具

top 是乙個強大的工具,它能給你提供 執行系統的動態實時檢視:

# top

閱讀這篇文章獲取更多 top 使用事例:linux 中 12 個 top 命令例項

3. glances – 系統監控工具

glances 是乙個相對比較新的系統監控工具,它有一些比較高階的功能

# glances

要獲取完整使用指南,請閱讀:glances – linux 的乙個高階實時系統監控工具

監控 linux 效能的 20 個命令列工具

13 個有用的 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

注意當你系統僵死freeze時你可以使用它們殺死 linux 中的不響應程式。

給程序傳送訊號

linux 中控制程序的基本方法是給它們傳送訊號。你可以傳送很多訊號給乙個程序,執行下面的命令可以檢視所有訊號:

$ kill -l

要給乙個程序傳送訊號,可以使用我們之前提到的 kill、pkill 或 pgrep 命令。但只有被程式設計為能識別這些訊號時程式才能響應這些訊號。

大部分訊號都是系統內部使用,或者給程式設計師編寫**時使用。下面是一些對系統使用者非常有用的訊號:

下面是當 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 

使用 nice 命令為乙個程序設定 nice 值。記住乙個普通使用者可以給他擁有的程序設定 0 到 20 的 nice 值。

只有 root 使用者可以使用負的 nice 值。

要重新設定乙個程序的優先順序,像下面這樣使用 renice 命令:

$ renice +8  2687

$ renice +8  2103

Linux 系統 關於守護程序

常駐程序,其實就是守護程序。在某家公司工作期間,會使用它來作為需要保活執行的機制,用以維護消費者程序。但當時對於守護程序的理解還是不夠深入,所以現在再把這塊做個整理,並結合當時遇到的乙個問題例項進行分析。注 下面內容都針對linux作業系統。mac上的launchd與systemd作用相同,而且據說...

Linux中關於fork 複製程序

fork 複製程序1 fork 的基本概念 乙個現有程序可以用fork 函式通過系統呼叫建立乙個新程序,該函式定義如下 include pid t fork void 返回 若成功則在子程序中返回0,在父程序中返回子程序pid,若出錯則返回 1 因此,可以通過返回值知道當前程序是父程序還是子程序。2...

linux 再回首 關於程序

1 全格式顯示系統中所有的程序資訊 ps ef 全格式顯示系統中所有的程序資訊 uid pid ppid c stime tty time cmd root 1 0 0 aug14 00 17 46 usr lib systemd systemd system deserialize 22 root...