目錄linux
1.程序是數據和指令的集合,是一個靜態的概念,好比/bin/ls、/bin/cp等二進制文件,同時程序能夠長期存在系統中。nginx
2.進程是一個程序的運行過程,是一個動態概念,進程是存在生命週期概念的,也就是說進程會隨着程序的終止而銷燬,不會永遠在系統中存在。apache
1.當父進程接收到任務調度時,會經過fork派生子進程來處理,那麼子進程會集成父進程的衣鉢。
2.子進程在處理任務代碼時,父進程會進入等待的狀態...
3.若是子進程在處理任務過程當中,父進程退出了,子進程沒有退出,那麼這些子進程就沒有父進程來管理了,就變成了殭屍進程。
4.每一個進程都會有本身的PID號,(process id)子進程則PPIDvim
使用ps命令查看當前的進程狀態(靜態查看)bash
經常使用組合:ps aux 查看進程服務器
[root@zls ~]# ps aux a:顯示全部與終端相關的進程,由終端發起的 u:顯示用戶導向的用戶列表 x:顯示全部與終端無關的進程
在多任務處理操做系統中,每一個CPU(或核心)在一個時間點上只能處理一個進程。
在進程運行時,它對 CPU 時間和資源分配的要求會不斷變化,從而爲進程分配一個狀態,它隨着環境要求而改變。less
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
第一行內容: 當前系統時間 服務器運行時間 有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
KiB Swap: 2097148 total, 2097148 free, 0 used. 1645080 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM 進程號 用戶 優先級 虛擬內存 物理內存 共享內存 狀態 佔CPU百分比 佔內存百分比 TIME+ COMMAND 運行時間 進程的運行命令
中斷是系統用來影響硬件設備請求的一種機制,它會打斷進程的正常調度和執行,而後調用內核中的終端處理程序來影響設備的請求。ssh
事實上,爲了解決中斷處理程序執行過長的和丟失中斷的問題,Linux將中斷處理過程分紅了兩個階段:
第一階段:用來快速處理(硬中斷)中斷,它在中斷禁止模式下運行,主要處理跟硬件緊密相關工做
第二階段:用來延遲處理第一階段未完成的工做,一般之內核線程的方式運行。操作系統
例如:線程
第一階段:當你接到第一個配送員電話時,你能夠跟他說,你已經知道了,其餘事見面再細說,而後就能夠掛斷電話了。
第二階段:纔是取外賣,而後見面聊發票的處理動做。
如此一來,第一個配送員不會在電話裏佔用你很長時間,第二個配送員來的時候,照樣能夠打通電話。
[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還有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