[toc] linux系統管理 進程管理 程式和進程的區別 1.程式是數據和指令的集合,是一個靜態的概念,比如/bin/ls、/bin/cp等二進位文件,同時程式可以長期存在系統中。 2.進程是一個程式的運行過程,是一個動態概念,進程是存在生命周期概念的,也就是說進程會隨著程式的終止而銷毀,不會永遠 ...
目錄
linux系統管理-進程管理
程式和進程的區別
1.程式是數據和指令的集合,是一個靜態的概念,比如/bin/ls、/bin/cp等二進位文件,同時程式可以長期存在系統中。
2.進程是一個程式的運行過程,是一個動態概念,進程是存在生命周期概念的,也就是說進程會隨著程式的終止而銷毀,不會永遠在系統中存在。
進程的生命周期
程式運行是進程的狀態關係
1.當父進程接收到任務調度時,會通過fork派生子進程來處理,那麼子進程會集成父進程的衣缽。
2.子進程在處理任務代碼時,父進程會進入等待的狀態...
3.如果子進程在處理任務過程中,父進程退出了,子進程沒有退出,那麼這些子進程就沒有父進程來管理了,就變成了僵屍進程。
4.每個進程都會有自己的PID號,(process id)子進程則PPID
進程狀態管理命令(靜態)
使用ps命令查看當前的進程狀態(靜態查看)
常用組合:ps aux 查看進程
[root@zls ~]# ps aux
a:顯示所有與終端相關的進程,由終端發起的
u:顯示用戶導向的用戶列表
x:顯示所有與終端無關的進程
在多任務處理操作系統中,每個CPU(或核心)在一個時間點上只能處理一個進程。
在進程運行時,它對 CPU 時間和資源分配的要求會不斷變化,從而為進程分配一個狀態,它隨著環境要求而改變。
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
USER: //啟動程式的用戶
PID: //進程ID
%CPU: //占用CPU的百分比
%MEM: //占用記憶體的百分比
VSZ: //虛擬記憶體集(進程占用虛擬記憶體的空間)
RSS: //物理記憶體集(進程占用物理記憶體的空間)
TTY: //運行的終端
?: #內核運行的終端
tty1: #機器運行的終端
pts/0: #遠程連接的終端
STAT: //進程狀態
D: #無法中斷的休眠狀態(通IO的進程)
R: #正在運行的狀態
S: #處於休眠的狀態
T: #暫停或被追蹤的狀態
W: #進入記憶體交換(從內核2.6開始無效)
X: #死掉的進程(少見)
Z: #僵屍進程
<: #優先順序高的進程
N: #優先順序較低的進程
L: #有些頁被鎖進記憶體
s: #父進程(在它之下有子進程開啟著)
+: #該進程運行在前臺
l: #以線程的方式運行
|: #多進程的
START: //進程被觸發開啟的時間
TIME: //該進程實際使用CPU的運行時間
COMMAND: //命令的名稱和參數
[] : #內核態的進程
沒[]: #用戶態的進程
進程的相關命令
#對進程的CPU進行排序展示
[root@zls ~]# ps aux --sort %cpu |less
#對進程的占用物理記憶體排序
[root@zls ~]# ps aux --sort rss |less
#排序,是在記不住,那就自己排序
[root@zls ~]# ps aux|sort -k3 -n
#自定義顯示欄位
[root@zls ~]# ps axo user,pid,ppid,%mem,command |grep sshd
root 869 1 0.2 /usr/sbin/sshd -D
root 1194 869 0.2 sshd: root@pts/0
root 1307 869 0.2 sshd: root@pts/1
root 1574 869 0.2 sshd: root@pts/2
#顯示進程的子進程
[root@zls ~]# yum install nginx -y
[root@zls ~]# systemctl start nginx
[root@zls ~]# ps auxf|grep [n]ginx
root 2033 0.0 0.1 125096 2112 ? Ss 13:29 0:00 nginx: master process /usr/sbin/nginx
nginx 2034 0.0 0.1 125484 3148 ? S 13:29 0:00 \_ nginx: worker process
#查看指定進程PID
[root@zls ~]# ps aux|grep sshd
root 1157 0.0 0.1 105996 3604 ? Ss Feb27 0:00 /usr/sbin/sshd -D
[root@zls ~]# cat /run/sshd.pid
1157
#pgrep常用參數, -l -a
[root@zls ~]# pgrep sshd
869
1194
1307
1574
[root@zls ~]# pgrep -l sshd
869 sshd
1194 sshd
1307 sshd
1574 sshd
[root@zls ~]# pgrep -l -a sshd
869 /usr/sbin/sshd -D
1194 sshd: root@pts/0
1307 sshd: root@pts/1
1574 sshd: root@pts/2
#查看進程的pid
[root@zls ~]# pidof sshd
1574 1307 1194 869
#查看進程樹
[root@zls ~]# pstree
動態進程監控(top)
top前兩行內容解析
第一行內容:
當前系統時間 伺服器運行時間 有3個用戶在登錄
top - 10:54:23 up 1 day, 17:56, 3 users,
#平均負載(系統) 1分鐘 5分鐘 15分鐘
load average: 0.00, 0.01, 0.05
第二行內容:
總共122個任務 1個正在運行(R) 121個進入睡眠狀態的(S) 沒有停止(T)Tasks: 122 total, 1 running, 121 sleeping, 0 stopped,
0個僵屍進程(Z)
0 zombie
第三行內容
用戶態 內核態 優先順序 空閑 等待(wait) 硬中斷 軟中斷 %Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si,
虛擬機占用物理機CPU的百分比
0.0 st
第四行:記憶體
KiB Mem : 2028116 total, 150780 free, 144108 used, 1733228 buff/cache
第五行:swap虛擬記憶體
KiB Swap: 2097148 total, 2097148 free, 0 used. 1645080 avail Mem
第六行
PID USER PR NI VIRT RES SHR S %CPU %MEM
進程號 用戶 優先順序 虛擬記憶體 物理記憶體 共用記憶體 狀態 占CPU百分比 占記憶體百分比
TIME+ COMMAND
運行時間 進程的運行命令
中斷:硬中斷
中斷是系統用來影響硬體設備請求的一種機制,它會打斷進程的正常調度和執行,然後調用內核中的終端處理程式來影響設備的請求。
軟中斷:
事實上,為瞭解決中斷處理程式執行過長的和丟失中斷的問題,Linux將中斷處理過程分成了兩個階段:
第一階段:用來快速處理(硬中斷)中斷,它在中斷禁止模式下運行,主要處理跟硬體緊密相關工作
第二階段:用來延遲處理第一階段未完成的工作,通常以內核線程的方式運行。
例如:
第一階段:當你接到第一個配送員電話時,你可以跟他說,你已經知道了,其他事見面再細說,然後就可以掛斷電話了。
第二階段:才是取外賣,然後見面聊發票的處理動作。
如此一來,第一個配送員不會在電話里占用你很長時間,第二個配送員來的時候,照樣可以打通電話。
top命令的使用
[root@zls ~]# top
#指定N秒變化時間
[root@zls ~]# top -d 1
#查看指定進程的動態信息
[root@zls ~]# top -d 1 -p 10126
[root@zls ~]# top -d 1 -p 10126,1
#查看指定用戶的進程
[root@zls ~]# top -d 1 -u apache
#將 2 次 top 信息寫入到文件
[root@zls ~]# top -d 1 -b -n 2 > top.txt
top 常見指令
h 查看幫出
z 高亮顯示
1 顯示所有CPU的負載
s 設置刷新時間
b 高亮現實處於R狀態的進程
M 按記憶體使用百分比排序輸出
P 按CPU使用百分比排序輸出
R 對排序進行反轉
f 自定義顯示欄位
k kill掉指定PID進程
W 保存top環境設置 ~/.toprc
q 退出
信號管理進程(kill)
當程式運行為進程後,如果希望強行停止就可以使用kill命令對進程發送關閉信號
,除了kill還有pkill、killall
定義守護進程的角色
結束用戶會話和進程
[root@zls ~]# kill -l //列出所有支持的信號
//常見信號列表:
數字信號 信號別名 作用
1 HUP 掛起信號,往往可以讓進程重新配置
2 INT 中斷信號,起到結束進程的作用,和ctrl + c 的作用一樣
3 QUIT 讓進程退出,結果是進程退出
9 KILL 直接結束進程,不能被進程捕獲
15 TERM 進程終止,這是預設信號
18 CONT 被暫停的進程將繼續恢復運行
19 STOP 暫停進程
20 TSTP 用戶停止請求,作用類似於ctrl + z 把進程放到後臺並暫停
kill命令發送指令
// 給 vsftpd 進程發送信號 1,15
[root@zls ~]# yum -y install vsftpd
[root@zls ~]# systemctl start vsftpd
//發送重啟信號,例如 vsftpd 的配置文件發生改變,希望重新載入
[root@zls ~]# kill -1 9160
//發送停止信號,vsftpd 服務有停止的腳本 systemctl stop vsftpd
[root@zls ~]# kill 9160
// 給vim進程發送信號 9,15
[root@zls ~]# touch file1 file2
//使用遠程終端1打開file1
[root@zls ~]# tty
/dev/pts/1
[root@zls ~]# vim file1
//使用遠程終端2打開file2
[root@zls ~]# tty
/dev/pts/2
[root@zls ~]# vim file2
//查看當前進程pid
[root@zls ~]# ps aux |grep vim
root 4362 0.0 0.2 11104 2888 pts/1 S+ 23:02 0:00 vim file1
root 4363 0.1 0.2 11068 2948 pts/2 S+ 23:02 0:00 vim file2
//發送15信號
[root@zls ~]# kill 4362
//發送9信號
[root@zls ~]# kill -9 4363
//還可以同時給所有vim進程發送信號, 模糊匹配,同時給多個進程發送信號
[root@zls ~]# killall vim
//使用pkill踢出從遠程登錄到本機的用戶, pkill 類似killall
[root@zls ~]# w
20:50:17 up 95 days, 9:30, 1 user, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
xuliangw pts/0 115.175.115.39 20:22 0.00s 0.01s 0.00s sshd: zls [priv]
//終止 pts/0上所有進程, 除了bash本身
[root@zls ~]# pkill -t pts/0
//終止pts/0上所有進程, 並且bash也結束(用戶被強制退出)
[root@zls ~]# pkill -9 -t pts/0
//列出zls用戶的所有進程,-l輸出pid
[root@linux-zls ~]# pgrep -l -u zls
32206 sshd
32207 bash