進程
概念; 進程是一個具有一定獨立功能的程序在一個數據集上的一次動態(tài)執(zhí)行的過程 ,可以理解為正在運行的程序
linux內核維護著一張記錄系統(tǒng)中運行的所有進程的各種信息,會自動完成對進程的控制和調度,內核中一些重要的進程信息如下:
- 進程的內存地址
- 進程當前的狀態(tài)
- 進程正在使用的資源
- 進程的優(yōu)先級
- 進程的屬主
進程的一些屬性
進程的ID號:PID,標志著這個進程
-
父進程的ID號:PPID,在linux系統(tǒng)中,所有的進程都必須由另一個進程創(chuàng)建,除了系統(tǒng)引導時,由內核自主創(chuàng)建并安裝的那幾個進程,創(chuàng)建進程的那個進程被成為父進程。
注意:linux并沒有提供一種系統(tǒng)調用來讓應用程序“創(chuàng)建”一個進程,而是通過克隆自己來產生新進程
-
真實和有效的用戶ID:
- UID:只有進程的創(chuàng)建者和root用戶才有權力對該進程進行操作,于是記錄了一個進程的屬主,進程的UID就是其創(chuàng)建者的用戶ID
- EUID:linux還為進程保存了一個“有效用戶ID號”,這個EUID號用來確定進程對某些資源和文件的訪問權限,eg:setuid程序
-
真實和有效的組ID:
- GID:創(chuàng)建者所屬組的ID號
- EGID:與EUIDl類似,可以通過setgid程序來設置
謙讓度與優(yōu)先級
監(jiān)視進程
-
ps命令
ps aux ##顯示當前系統(tǒng)上運行的所有進程的信息 ps lax ##不會顯示進程屬主的用戶名(因此運行速度更快),但是可以提供父進程ID和謙讓度(NI) -
說明:
USER:進程創(chuàng)建者的用戶名
PID:進程的ID號
%CPU:進程占用的cpu百分比
%MEN:進程占用的內存百分比
VSZ:進程占用的虛擬內存大小
RSS:內存中頁的數量(頁是管理內存的大小,在PC上通常是4K)
TTY:進程所在終端的ID號
-
STAT:
-
進程狀態(tài)
- R:正在運行
- S:睡眠中(可以被喚醒)
- Z:僵進程(已經結束而沒有釋放系統(tǒng)資源的進程)
- D:睡眠中(不可被喚醒,通常是在等待I/O設備)
- T:停止(由于收到信號或被跟蹤)
-
常用的附加標志:
- <:進程擁有比普通優(yōu)先級高的優(yōu)先級
- N:進程擁有比普通優(yōu)先級低的優(yōu)先級
- L:有些頁面被鎖在內存中
- s:會話的先導進程
-
START:進程啟動的時間
TIME:進程已經占用CPU的時間
COMMAND:命令和參數
即時跟蹤進程信息
- top命令:即使跟蹤當前系統(tǒng)中進程的情況,默認情況下每10s更新一次,使用命令q退出這個監(jiān)視程序
查看占用文件的進程:lsof
lsof 文件名
不帶參數的lsof會列出所有打開文件的進程的信息
向進程發(fā)送信號:kill
kill命令總是用來殺死一個進程,但事實上,從本質上講,kill命令只是用來向進程發(fā)送一個信號,至于這個信號是什么,則是由用戶指定的
kill [-signal] pid ##標準語法
kill -l ##顯示所有信號及其編號
根據硬件體系結構不同,列表會有所不同,信號名的前綴SIG可以省略
- 常用信號
| 信號編號 | 信號名 | 描述 | 默認情況下執(zhí)行的操作 |
|---|---|---|---|
| 0 | EXIT | 程序退出時收到該信號 | 終止 |
| 1 | HUP | 掛起 | 終止 |
| 2 | INT | 中斷 | 終止 |
| 3 | QUIT | 退出 | 終止 |
| 9 | KILL | 殺死 | 終止 |
| 11 | SEGV | 段錯誤 | 終止 |
| 15 | TERM | 軟件終止 | 終止 |
注意:killl命令不一定可以終止一個程序,kill命令向程序發(fā)送的一個信號,這個信號可以被程序捕捉,程序可以封鎖或者干脆忽略,所以只有在信號沒有被程序捕捉的情況下,系統(tǒng)才會執(zhí)行默認操作。例如
#! /bin/bash
trap "" TEEM
while echo "i am making files"
do
mk adir
cd adir
touch afile
sleep 2s
done
上面這個文件,一旦被執(zhí)行,使用kill -TERM 將無法終止,trap “” TERM將會忽略TERM信號,但有一個信號永遠都不能被程序所捕捉,就是KILL信號,KILL可以在內核級別殺死一個而進程,所以,可以使用
kill -9 pid
kill -KILL pid
來殺死進程,然而也有一些退化的I/O虛假鎖造成的進程,kill也無法影響他們,只能重啟系統(tǒng)
-
trap知識補充: 用于指定在接收到信號后將要采取的動作
trap command signal ##signal 為接收到的信息,command為接收到信號后執(zhí)行的操作:三種形式 1 trap "commands" signal-list ## 當腳本收到signal-list清單內列出的信號時,trap命令執(zhí)行雙引號中的命令。 2 trap signal-list ##trap不指定任何命令,接受信號的默認操作,默認操作是結束進程的運行 3 trap " " signal-list ## trap命令指定一個空命令串,允許忽視信號,我們用到的就是這一種調整進程的謙讓度
-
nice命令:在啟動程序時設置其謙讓度
nice -n 2 bc## -n參數用戶增加程序的謙讓度值 bc為指定程序 nice bc ##不帶參數的nice會將程序的謙讓度增量設置為10 nice ##不帶任何參數的nice可以查看默認的謙讓度值 -
renice命令:在程序運行時調整其謙讓度值
renice +12 -p 3244 ## -p指定進程號
新進程會從其父進程那里繼承謙讓度,進程的屬主可以提高其謙讓度,但不能降低其謙讓度,保證低優(yōu)先級的進程不會派生出高優(yōu)先級的子進程,但是root用戶可以任意設置進程的優(yōu)先級
/proc文件系統(tǒng)
一個非常特殊的文件系統(tǒng),存放著內核有關系統(tǒng)狀態(tài)的各種有意義的信息。在系統(tǒng)運行時,內核會隨時向這個目錄寫入數據,ps和top命令就是從這個地方讀取數據的,這是操作系統(tǒng)向用戶提供的一條通往內核的通道,用戶甚至可以通過向/proc目錄下的文件寫入數據來 修改操作系統(tǒng)參數。