網站首頁 編程語言 正文
一、簡介
當我們運行程序時,Linux會為程序創建一個特殊的環境,該環境包含程序運行需要的所有資源,以保證程序能夠獨立運行,不受其他程序的干擾。這個特殊的環境就稱為進程。每個 Linux 命令都與系統中的程序對應,輸入命令,Linux 就會創建一個新的進程。例如使用 ls 命令遍歷目錄中的文件時,就創建了一個進程。簡而言之,進程就是程序的實例。?
系統通過一個五位數字跟蹤程序的運行狀態,這個數字稱為 pid 或進程ID。每個進程都擁有唯一的 pid。?
理論上,五位數字是有限的,當數字被用完時,下一個 pid 就會重新開始,所以 pid 最終會重復。但是,兩個 pid 一樣的進程不能同時存在,因為Linux會使用 pid 來跟蹤程序的運行狀態。
二、創建進程
有兩種方式來創建進程:前臺進程和后臺進程。
1、前臺進程
默認情況下,用戶創建的進程都是前臺進程;前臺進程從鍵盤讀取數據,并把處理結果輸出到顯示器。?
我們可以看到前臺進程的運行過程。例如,使用 ls 命令來遍歷當前目錄下的文件:
$ls ch*.doc
ch01-1.doc ch010.doc ch02.doc ch03-2.doc
ch04-1.doc ch040.doc ch05.doc
這個程序就運行在前臺,它會直接把結果輸出到顯示器。如果 ls 命令需要數據(實際上不需要),那么它會等待用戶從鍵盤輸入。
當程序運行在前臺時,由于命令提示符($)還未出現,用戶不能輸入其他命令;即使程序需要運行很長時間,也必須等待程序運行結束才能輸入其他命令。
2、后臺進程
后臺進程與鍵盤沒有必然的關系。當然,后臺進程也可能會等待鍵盤輸入。?
后臺進程的優點是不必等待程序運行結束就可以輸入其他命令。?
創建后臺進程最簡單的方式就是在命令的末尾加?&,例如:
$ls ch*.doc &
ch01-1.doc ch010.doc ch02.doc ch03-2.doc
ch04-1.doc ch040.doc ch05.doc ch06-2.doc
ch01-2.doc ch02-1.doc
如果 ls 命令需要輸入(實際上不需要),那么它會暫停,直到用戶把它調到前臺并從鍵盤輸入數據才會繼續運行。
三、查看正在運行的進程
可以使用?ps?命令查看進程的運行狀態,包括后臺進程,例如:
$ps
PID TTY TIME CMD
18358 ttyp3 00:00:00 sh
18361 ttyp3 00:01:31 abiword
18789 ttyp3 00:00:00 ps
還可以結合?-f?選項查看更多信息,f 是 full 的縮寫,例如:
$ps -f
UID PID PPID C STIME TTY TIME CMD
amrood 6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood 6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood 3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood 6892 3662 4 10:51:50 pts/6 0:00 ps -f
每列的含義如下:
- UID:進程所屬用戶的ID,即哪個用戶創建了該進程。
- PID:進程ID。
- PPID:父進程ID,創建該進程的進程稱為父進程。
- C:CPU使用率。
- STIME:進程被創建的時間。
- TTY:與進程有關的終端類型。
- TIME:進程所使用的CPU時間。
- CMD:創建該進程的命令。
ps 命令還有其他一些選項:
- -a:顯示所有用戶的所有進程。
- -x:顯示無終端的進程。
- -u:顯示更多信息,類似于 -f 選項。
- -e:顯示所有進程。
四、終止進程
當進程運行在前臺時,可以通過?kill?命令或?Ctrl+C 組合鍵來結束進程。?
如果進程運行在后臺,那么首先要通過?ps?命令來獲取進程ID,然后使用?kill?命令“殺死”進程,例如:
$ps -f
UID PID PPID C STIME TTY TIME CMD
amrood 6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood 6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood 3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood 6892 3662 4 10:51:50 pts/6 0:00 ps -f
$kill 6738
Terminated
如上所示,kill 命令終結了 first_one 進程。
如果進程忽略 kill 命令,那么可以通過 kill -9 來結束:
$kill -9 6738
Terminated
1.命令格式:
kill[參數][進程號]
2.命令功能:
發送指定的信號到相應進程。不指定型號將發送SIGTERM(15)終止指定進程。如果任無法終止該程序可用“-KILL” 參數,其發送的信號為SIGKILL(9) ,將強制結束進程,使用ps命令或者jobs 命令可以查看進程號。root用戶將影響用戶的進程,非root用戶只能影響自己的進程。
3.命令參數:
- -l 信號,若果不加信號的編號參數,則使用“-l”參數會列出全部的信號名稱
- -a 當處理當前進程時,不限制命令名和進程號的對應關系
- -p 指定kill 命令只打印相關進程的進程號,而不發送任何信號
- -s 指定發送信號
- -u 指定用戶
注意:
- kill命令可以帶信號號碼選項,也可以不帶。如果沒有信號號碼,kill命令就會發出終止信號(15),這個信號可以被進程捕獲,使得進程在退出之前可以清理并釋放資源。也可以用kill向進程發送特定的信號。例如:?
kill -2 123?
它的效果等同于在前臺運行PID為123的進程時按下Ctrl+C鍵。但是,普通用戶只能使用不帶signal參數的kill命令或最多使用-9信號。 - kill可以帶有進程ID號作為參數。當用kill向這些進程發送信號時,必須是這些進程的主人。如果試圖撤銷一個沒有權限撤銷的進程或撤銷一個不存在的進程,就會得到一個錯誤信息。
- 可以向多個進程發信號或終止它們。
- 當kill成功地發送了信號后,shell會在屏幕上顯示出進程的終止信息。有時這個信息不會馬上顯示,只有當按下Enter鍵使shell的命令提示符再次出現時,才會顯示出來。
- 應注意,信號使進程強行終止,這常會帶來一些副作用,如數據丟失或者終端無法恢復到正常狀態。發送信號時必須小心,只有在萬不得已時,才用kill信號(9),因為進程不能首先捕獲它。要撤銷所有的后臺作業,可以輸入kill 0。因為有些在后臺運行的命令會啟動多個進程,跟蹤并找到所有要殺掉的進程的PID是件很麻煩的事。這時,使用kill 0來終止所有由當前shell啟動的進程,是個有效的方法。
信號說明:
只有第9種信號(SIGKILL)才可以無條件終止進程,其他信號進程都有權利忽略。 下面是常用的信號:
- HUP 1 終端斷線
- INT 2 中斷(同 Ctrl + C)
- QUIT 3 退出(同 Ctrl + \)
- TERM 15 終止
- KILL 9 強制終止
- CONT 18 繼續(與STOP相反, fg/bg命令)
- STOP 19 暫停(同 Ctrl + Z)
五、父進程和子進程
每個 Linux 進程會包含兩個進程ID:當前進程ID(pid)和父進程ID(ppid)??梢詴簳r認為所有的進程都有父進程。?
由用戶運行的大部分命令都將 Shell 作為父進程,使用?ps -f?命令可以查看當前進程ID和父進程ID。
六、僵尸進程和孤兒進程
正常情況下,子進程被終止時會通過 SIGCHLD 信號通知父進程,父進程可以做一些清理工作或者重新啟動一個新的進程。但在某些情況下,父進程會在子進程之前被終止,那么這些子進程就沒有了“父親”,被稱為孤兒進程。?
init 進程會成為所有孤兒進程的父進程。init 的 pid 為1,是Linux系統的第一個進程,也是所有進程的父進程。?
如果一個進程被終止了,但是使用 ps 命令仍然可以查看該進程,并且狀態為 Z,那么這就是一個僵尸進程。僵尸進程雖然被終止了,但是仍然存在于進程列表中。一般僵尸進程很難殺掉,你可以先殺死他們的父進程,讓他們變成孤兒進程,init 進程會自動清理僵尸進程。
七、常駐進程
常駐進程一般是系統級進程,以 root 權限運行在后臺,可以處理其他進程的請求。?
常駐進程沒有終端,不能訪問 /dev/tty 文件,如果使用 ps -ef 查看該進程,tty 這一列會顯示問號(?)。?
更確切地說,常駐進程通常運行在后臺,等待指定事件發生,例如打印進程是一個常駐進程,它會等待用戶輸入打印相關的命令并進行處理。
八、top命令
top 命令是一個很有用的工具,它可以動態顯示正在運行的進程,還可以按照指定條件對進程進行排序,與Windows的任務管理器類似。?
top 命令可以顯示進程的很多信息,包括物理內存、虛擬內存、CPU使用率、平均負載以及繁忙的進程等。例如:
$top
九、任務和進程
任務(task)是最抽象的,是一個一般性的術語,指由軟件完成的一個活動。一個任務既可以是一個進程,也可以是多個進程。簡而言之,它指的是一系列共同達到某一目的的操作。例如,讀取數據并將數據放入內存中。這個任務可以由一個進程來實現,也可以由多個進程來實現。 每個任務都有一個數字表示的任務號。
進程(process)常常被定義為程序的執行。可以把一個進程看成是一個獨立的程序,在內存中有其完備的數據空間和代碼空間。一個進程所擁有的數據和變量只屬于它自己。
jobs?命令可以用來查看系統中正在運行的任務,包括后臺運行的任務。該命令可以顯示任務號及其對應的進程ID。一個任務可以對應于一個或者多個進程號。?
jobs 命令的 -l 選項可以查看當前任務包含的進程ID:
$jobs -l
[1] + 1903 running ls ch*.doc &
$
其中,第一列表示任務號,第二列表示任務對應的進程ID,第三列表示任務的運行狀態,第四列表示啟動任務的命令。
十、前臺任務和后臺任務的切換
1、fg?命令可以將后臺任務調到前臺,語法為:
$fg %jobnumber
jobnumber 是通過 jobs 命令獲取的后臺任務的的序號,注意不是pid。如果后臺只有一個任務,可以不指定 jobnumber。
2、bg?命令可以將后臺暫停的任務,調到前臺繼續運行,語法為:
$bg %jobnumber
jobnumber 同樣是通過 jobs 命令獲取的后臺任務的的序號,注意不是pid。如果前臺只有一個任務,可以不指定 jobnumber。?
如果希望將當前任務轉移到后臺,可以先 Ctrl+z 暫停任務,再使用 bg 命令。任務轉移到后臺可以空出終端,繼續輸入其他命令。
原文鏈接:https://www.cnblogs.com/springsnow/p/12193263.html
相關推薦
- 2022-04-30 C語言程序環境中的預處理詳解_C 語言
- 2022-09-29 數據設計之權限的實現_數據庫其它
- 2022-08-05 從List<Map>中截取指定的范圍數據集合
- 2022-05-11 C#對集合進行排序_C#教程
- 2022-05-23 c++?qt自定義搜索編輯框的實現方法_C 語言
- 2022-09-09 C語言中回調函數和qsort函數的用法詳解_C 語言
- 2022-06-18 asp.net中Log4.net的工具類helper_實用技巧
- 2022-09-23 win11下FTP服務器搭建圖文教程_FTP服務器
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支