您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Linux進(jìn)程怎么創(chuàng)建和啟動”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Linux進(jìn)程怎么創(chuàng)建和啟動”吧!
在 Linux 中主要有兩種類型的進(jìn)程:
前臺進(jìn)程(也稱為交互式進(jìn)程) - 這些進(jìn)程由終端會話初始化和控制。換句話說,需要有一個連接到系統(tǒng)中的用戶來啟動這樣的進(jìn)程;它們不是作為系統(tǒng)功能/服務(wù)的一部分自動啟動。 后臺進(jìn)程(也稱為非交互式/自動進(jìn)程) - 這些進(jìn)程沒有連接到終端;它們不需要任何用戶輸入。
這是后臺進(jìn)程的特殊類型,它們在系統(tǒng)啟動時啟動,并作為服務(wù)一直運(yùn)行;它們不會死亡。它們自發(fā)地作為系統(tǒng)任務(wù)啟動(作為服務(wù)運(yùn)行)。但是,它們能被用戶通過 init 進(jìn)程控制(RHEL&CentOs7 后systemd替換了init 進(jìn)程具體可參看Linux就該這樣學(xué)相關(guān)內(nèi)容)。
在 Linux 中創(chuàng)建進(jìn)程有三種方式:
fork() 方式
使用 fork() 函數(shù)以父進(jìn)程為藍(lán)本復(fù)制一個進(jìn)程,其 PID號與父進(jìn)程 PID 號不同。在 Linux 環(huán)境下,fork() 是以寫復(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ù)會調(diào)用 /bin/sh –c command 來執(zhí)行特定的命令,并且阻塞當(dāng)前進(jìn)程的執(zhí)行,直到 command 命令執(zhí)行完畢。新的子進(jìn)程會有新的 PID。
exec() 方式
exec() 方式有若干種不同的函數(shù),與之前的 fork() 和 system() 函數(shù)不同,exec() 方式會用新進(jìn)程代替原有的進(jìn)程,系統(tǒng)會從新的進(jìn)程運(yùn)行,新的進(jìn)程的 PID 值會與原來的進(jìn)程的 PID 值相同。
由于 Linux 是一個多用戶系統(tǒng),意味著不同的用戶可以在系統(tǒng)上運(yùn)行各種各樣的程序,內(nèi)核必須唯一標(biāo)識程序運(yùn)行的每個實(shí)例。
程序由它的進(jìn)程 ID(PID)和它父進(jìn)程的進(jìn)程 ID(PPID)識別,因此進(jìn)程可以被分類為:
父進(jìn)程 - 這些是在運(yùn)行時創(chuàng)建其它進(jìn)程的進(jìn)程。 子進(jìn)程 - 這些是在運(yùn)行時由其它進(jìn)程創(chuàng)建的進(jìn)程。
init 進(jìn)程
init 進(jìn)程是系統(tǒng)中所有進(jìn)程的父進(jìn)程,它是啟動 Linux 系統(tǒng)后第一個運(yùn)行的程序;它管理著系統(tǒng)上的所有其它進(jìn)程。它由內(nèi)核自身啟動,因此理論上說它沒有父進(jìn)程。
init 進(jìn)程的進(jìn)程 ID 總是為 1。它是所有子進(jìn)程的父進(jìn)程。(和根目錄和子目錄關(guān)系類似,一切從跟開始,一切從init進(jìn)程開始)。
查找進(jìn)程 ID
你可以用 pidof 命令查找某個進(jìn)程的進(jìn)程 ID:
# pidof systemd# pidof top# pidof httpd
要查找當(dāng)前 shell 的進(jìn)程 ID 以及它父進(jìn)程的進(jìn)程 ID,可以運(yùn)行:
$ echo $$ $ echo $PPID
每次你運(yùn)行一個命令或程序(例如 cloudcmd – CloudCommander),它就會在系統(tǒng)中啟動一個進(jìn)程。你可以按照下面的方式啟動一個前臺(交互式)進(jìn)程,它會被連接到終端,用戶可以發(fā)送輸入給它:
# cloudcmd
要在后臺(非交互式)啟動一個進(jìn)程,使用 & 符號,此時,該進(jìn)程不會從用戶中讀取輸入,直到它被移到前臺。
# cloudcmd &# jobs
你也可以使用 Ctrl + Z 暫停執(zhí)行一個程序并把它發(fā)送到后臺,它會給進(jìn)程發(fā)送 SIGSTOP 信號,從而暫停它的執(zhí)行;它就會變?yōu)榭臻e:
# tar -cf backup.tar /backups/* ### 按下 Ctrl+Z# jobs
要在后臺繼續(xù)運(yùn)行上面被暫停的命令,使用 bg 命令:
# bg
要把后臺進(jìn)程發(fā)送到前臺,使用 fg 命令以及任務(wù)的 ID,類似:
# jobs# fg %1
在執(zhí)行過程中,取決于它的環(huán)境一個進(jìn)程會從一個狀態(tài)轉(zhuǎn)變到另一個狀態(tài)。在 Linux 中,一個進(jìn)程有下面的可能狀態(tài):
Running - 此時它正在運(yùn)行(它是系統(tǒng)中的當(dāng)前進(jìn)程)或準(zhǔn)備運(yùn)行(它正在等待分配 CPU 單元)。Waiting - 在這個狀態(tài),進(jìn)程正在等待某個事件的發(fā)生或者系統(tǒng)資源。另外,內(nèi)核也會區(qū)分兩種不同類型的等待進(jìn)程;可中斷等待進(jìn)程interruptible waiting processes - 可以被信號中斷,以及不可中斷等待進(jìn)程uninterruptible waiting processes- 正在等待硬件條件,不能被任何事件/信號中斷。Stopped - 在這個狀態(tài),進(jìn)程已經(jīng)被停止了,通常是由于收到了一個信號。例如,正在被調(diào)試的進(jìn)程。Zombie - 該進(jìn)程已經(jīng)死亡,它已經(jīng)停止了但是進(jìn)程表process table中仍然有它的條目。
有很多 Linux 工具可以用于查看/列出系統(tǒng)中正在運(yùn)行的進(jìn)程,兩個傳統(tǒng)眾所周知的是 ps 和 top 命令:
1. ps 命令
它顯示被選中的系統(tǒng)中活躍進(jìn)程的信息,如下圖所示:
# ps# ps -e | head
2. top – 系統(tǒng)監(jiān)控工具
top 是一個強(qiáng)大的工具,它能給你提供 運(yùn)行系統(tǒng)的動態(tài)實(shí)時視圖,如下面截圖所示:
# top
3. glances – 系統(tǒng)監(jiān)控工具
glances 是一個相對比較新的系統(tǒng)監(jiān)控工具,它有一些比較高級的功能:
# glances
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)程的基本方法是給它們發(fā)送信號。你可以發(fā)送很多信號給一個進(jìn)程,運(yùn)行下面的命令可以查看所有信號:
$ kill -l
要給一個進(jìn)程發(fā)送信號,可以使用我們之前提到的 kill、pkill 或 pgrep 命令。但只有被編程為能識別這些信號時程序才能響應(yīng)這些信號。
大部分信號都是系統(tǒng)內(nèi)部使用,或者給程序員編寫代碼時使用。下面是一些對系統(tǒng)用戶非常有用的信號:
SIGHUP 1 - 當(dāng)控制它的終端被被關(guān)閉時給進(jìn)程發(fā)送該信號。 SIGINT 2 - 當(dāng)用戶使用 Ctrl+C 中斷進(jìn)程時控制它的終端給進(jìn)程發(fā)送這個信號。 SIGQUIT 3 - 當(dāng)用戶發(fā)送退出信號 Ctrl+D 時給進(jìn)程發(fā)送該信號。 SIGKILL 9 - 這個信號會馬上中斷(殺死)進(jìn)程,進(jìn)程不會進(jìn)行清理操作。 SIGTERM 15 - 這是一個程序終止信號(kill 默認(rèn)發(fā)送這個信號)。 SIGTSTP 20 - 它的控制終端發(fā)送這個信號給進(jìn)程要求它停止(終端停止);通過用戶按 Ctrl+Z 觸發(fā)。
下面是當(dāng) Firefox 應(yīng)用程序僵死時通過它的 PID 殺死它的 kill 命令事例:
$ pidof firefox $ kill 9 2687 或 $ kill -KILL 2687 或 $ kill -SIGKILL 2687
使用它的名稱殺死應(yīng)用,可以像下面這樣使用 pkill 或 killall:
$ pkill firefox $ killall firefox
在 Linux 系統(tǒng)中,所有活躍進(jìn)程都有一個優(yōu)先級以及 nice 值。有比點(diǎn)優(yōu)先級進(jìn)程有更高優(yōu)先級的進(jìn)程一般會獲得更多的 CPU 時間。
但是,有 root 權(quán)限的系統(tǒng)用戶可以使用 nice 和 renice 命令影響(更改)優(yōu)先級。
在 top 命令的輸出中, NI 顯示了進(jìn)程的 nice 值:
$ top
使用 nice 命令為一個進(jìn)程設(shè)置 nice 值。記住一個普通用戶可以給他擁有的進(jìn)程設(shè)置 0 到 20 的 nice 值。
只有 root 用戶可以使用負(fù)的 nice 值。
要重新設(shè)置一個進(jìn)程的優(yōu)先級,像下面這樣使用 renice 命令:
$ renice +8 2687 $ renice +8 2103
到此,相信大家對“Linux進(jìn)程怎么創(chuàng)建和啟動”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。