進程管理

進程概念 

程序通常是放置在磁盤中的,經過用戶的執行來觸發。出發後會被加載到內存中成爲一個個體,就是進程。
內核的功用:進程管理、文件系統、網絡功能、內存管理、驅動程序、安全功能等
Process: 運行中的程序的一個副本,是被載入內存的一個指令集合 進程ID(Process ID,PID)號碼被用來標記各個進程
UID、GID、和SELinux語境決定對文件系統的存取和訪問權限, 一般從執行進程的用戶來繼承
存在生命週期 
task struct:Linux內核存儲進程信息的數據結構格式 
task list:多個任務的的task struct組成的鏈表 
進程建立: init:第一個進程 父子關係
進程:都由其父進程建立,CoW fork(), clone()
進程:程序在一個數據集上的一次運行過程。是操做系統資源分配的基本單位。 
線程:是進程中的一個實體,是被操做系統獨立調度和執行的基本單位。一個進程包含一個或多個線程。
做業是向計算機提交任務的任務實體,
而進程是執行實體,是資源分配的基本單位,
線程是處理機調度的基本單位。
進程特徵  mysql

         動態性:進程的實質是程序在多道程序系統中的一次執行過程,進程是動態產生,動態消亡的。
   併發性:任何進程均可以同其餘進程一塊兒併發執行
   獨立性:進程是一個能獨立運行的基本單位,同時也是系統分配資源和調度的獨立單位;
   異步性:因爲進程間的相互制約,使進程具備執行的間斷性,即進程按各自獨立的、不可預知的速度向前推動
   結構特徵:進程由程序、數據和進程控制塊三部分組成。
  多個不一樣的進程能夠包含相同的程序:一個程序在不一樣的數據集裏就構成不一樣的進程,能獲得不一樣的結果;可是執行過程當中,程序不能發生改變。
進程的狀態和轉換
進程執行時的間斷性,決定了進程可能具備多種狀態。事實上,運行中的進程可能具備如下三種基本狀態。
  1)就緒狀態(Ready)
  進程已得到除處理器外的所需資源,等待分配處理器資源;只要分配了處理器進程就可執行。就緒進程能夠按多個優先級來劃分隊列。例如,當一個進程因爲時間片用完而進入就緒狀態時,排入低優先級隊列;當進程由I/O操做完成而進入就緒狀態時,排入高優先級隊列。
  2)運行狀態(Running):
  進程佔用處理器資源;處於此狀態的進程的數目小於等於處理器的數目。在沒有其餘進程能夠執行時(如全部進程都在阻塞狀態),一般會自動執行系統的空閒進程。
  3)阻塞狀態(Blocked):
  因爲進程等待某種條件(如I/O操做或進程同步),在條件知足以前沒法繼續執行。該事件發生前即便把處理機分配給該進程,也沒法運行。ios

 

 

進程狀態五態模型:

運行狀態(Running):當一個進程正在處理機上運行時。
就緒狀態(Ready):一個進程得到了除處理機以外的一切所需資源,一旦獲得處理機便可運行.
等待狀態又稱阻塞狀態(Blocked):一個進程正在等待某一事件而暫停運行時。如等待某資源,等待輸入/輸出完成。
建立狀態(NEW):一個進程正在被建立,還沒被轉到就緒狀態以前的狀態。
結束狀態(Exit):一個進程正在從系統中消失時的狀態,這是由於進程結束或因爲其餘緣由所致使。nginx

 

 

狀態之間轉換六種狀況

運行——>就緒:1,主要是進程佔用CPU的時間過長,而系統分配給該進程佔用CPU的時間是有限的;2,在採用搶先式優先級調度算法的系統中,當有更高優先級的進程要運行時,該進程就被迫讓出CPU,該進程便由執行狀態轉變爲就緒狀態。
就緒——>運行:運行的進程的時間片用完,調度就轉到就緒隊列中選擇合適的進程分配CPU
運行——>阻塞:正在執行的進程因發生某等待事件而沒法執行,則進程由執行狀態變爲阻塞狀態,如發生了I/O請求
阻塞——>就緒:進程所等待的事件已經發生,就進入就緒隊列
如下兩種狀態是不可能發生的:
阻塞——>運行:即便給阻塞進程分配CPU,也沒法執行,操做系統在進行調度時不會從阻塞隊列進行挑選,而是從就緒隊列中選取
就緒——>阻塞:就緒態根本就沒有執行,談不上進入阻塞態算法

查看進程ps [OPTION]...sql

支持三種選項: 
UNIX選項 如-A -e
BSD選項 如a 
GNU選項 如--help 
• 選項:默認顯示當前終端中的進程
• a 選項包括全部終端中的進程
• x 選項包括不連接終端的進程
• u 選項顯示進程全部者的信息
• f 選項顯示進程樹,至關於 --forest
• k|--sort 屬性 對屬性排序,屬性前加- 表示倒序 
• o 屬性… 選項顯示定製的信息 pid、cmd、%cpu、%mem
• L 顯示支持的屬性列表
ps常見選項 
-C cmdlist 指定命令,多個命令用,分隔
-L 顯示線程
-e: 顯示全部進程,至關於-A
-f: 顯示完整格式程序信息 -F: 顯示更完整格式的進程信息 
-H: 以進程層級格式顯示進程相關信息
-u userlist 指定有效的用戶ID或名稱
-U userlist 指定真正的用戶ID或名稱
-g gid或groupname 指定有效的gid或組名稱
-G gid或groupname 指定真正的gid或組名稱
-p pid 顯示指pid的進程 
--ppid pid 顯示屬於pid的子進程 
-M 顯示SELinux信息,至關於Z
ps輸出屬性
STAT:進程狀態 
R:running
S: interruptable sleeping
D: uninterruptable sleeping
T: stopped 
Z: zombie 
+: 前臺進程
l: 多線程進程 
L:內存分頁並帶鎖
N:低優先級進程 
<: 高優先級進程 
s: session leader,會話(子進程)發起者
ps經常使用組合:
aux
-ef
-eFH
-eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
ps示例apache

複製代碼
查詢你擁有的全部進程: ps -x
顯示指定用戶名(RUID)或用戶ID的進程: ps -fU apache ps -fu 4
顯示指定用戶名(EUID)或用戶ID的進程: ps -fu wang ps -fu 1000 
查看以root用戶權限(實際和有效ID)運行的每一個進程: ps -U root -u root
列出某個組擁有的全部進程(實際組ID:RGID或名稱): ps -fG nginx
列出有效組名稱(或會話)所擁有的全部進程: ps -fg mysql ps -fG 27
經過進程ID來顯示所屬的進程: ps -fp 1234
以父進程ID來顯示其下全部的進程,如顯示父進程爲1154的全部進程: ps -f --ppid 1234 
顯示指定PID的多個進程: ps -fp 1204,1239,1263
要按tty顯示所屬進程: ps -ft pst/0 ps示例
以進程樹顯示系統中的進程如何相互連接: ps -e --forest
以進程樹顯示指定的進程 ps -f --forest -C sshd ps -ef --forest | grep -v grep | grep sshd
要顯示一個進程的全部線程,將顯示LWP(輕量級進程)以及NLWP(輕量級進 程數)列: 
ps -fL -C nginx
要列出全部格式說明符: ps L
查看進程的PID,PPID,用戶名和命令: ps -eo pid,ppid,user,cmd
使用其PID查找進程名稱: ps -p 1244 -o comm= 
要以其名稱選擇特定進程,顯示其全部子進程: ps -C sshd,bash
複製代碼

 

pstree:顯示進程樹centos

pidof:查詢指定進程的PID緩存

pgrep:搜索指定的進程安全

  • -u uid: effective user,生效者
  • -U uid: real user,真正發起運行命令者
  • -t terminal: 與指定終端相關的進程
  • -l: 顯示進程名
  • -a: 顯示完整格式的進程名
  • -P pid: 顯示指定進程的子進程

uptime:查看系統的基本負載狀態bash

top:實時監控系統狀態工具

交互按鍵:

  • M:按內存使用排序
  • P:按CPU使用排序
  • l:顯示、隱藏top第一行
  • t:改變/隱藏CPU的顯示方式
  • m:改變/隱藏內存的顯示方式
  • 1:單CPU和總CPU
  • s:改變刷新間隔,默認3s
  • k:殺死進程
  • PID -- signal(15 關閉進程)
  • q:退出
  • W:將狀態保存到~/.roprc

選項:

  • -d #:指定時間間隔,秒
  • -b:顯示全部進程的狀態
  • -n #:刷新#次自動退出
複製代碼
複製代碼
[root@rhel6 ~]# top -n1 -b
top - 03:06:25 up 10:41,  1 user,  load average: 0.00, 0.01, 0.05
top - 系統時間 up 啓動了多長時間 用戶 負載:(1,5,10)分鐘的平均負載 Tasks: 132 total, 1 running, 131 sleeping, 0 stopped, 0 zombie
總進程數 正在運行進程數 睡眠進程數 中止態進程數 殭屍進程數 Cpu(s): 0.2%us, 0.5%sy, 0.0%ni, 99.2%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu(s):用戶空間使用率 系統空間使用率 nice值 空閒率 等待率 硬中斷率 軟中斷率 被偷走的時間(分配給虛擬機中的進程的時間片) Mem: 1004136k total, 452340k used, 551796k free, 40868k buffers Swap: 2097148k total, 0k used, 2097148k free, 263940k cached
總內存大小 已使用 空閒內存 緩存使用 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 19356 1552 1232 S 0.0 0.2 0:00.89 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
複製代碼
複製代碼

htop(epel):top的加強版,界面更友好,支持鼠標點擊

iotop:用來監視磁盤I/O使用情況

選項:

  • -o:只看產生IO的進程
  • -b:非交互式
  • -n #:檢測#次,默認爲一直檢測
  • -d #:檢測間隔#秒
  • -p PID:檢測指定PID的進程
  • -u:檢測指定用戶產生IO的狀況
  • -P:僅顯示進程,默認顯示線程
  • -a:顯示累計的IO量
  • -k:使用KB爲單位
  • -t:顯示時間戳
  • -q 只在第一次監測時顯示列名
  • -qq 永遠不顯示列名
  • -qqq 永遠不顯示I/O彙總

交互按鍵:

  • left和right方向鍵:改變排序
  • r:反向排序
  • o:切換至選項-o
  • p:切換至-p選項
  • a:切換至-a選項
  • q:退出
  • i:改變線程的優先級
複製代碼
Total DISK READ: 673.43 M/s | Total DISK WRITE: 0.00 B/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND         
線程ID(按p可切換PID) 優先級 用戶 讀速度 寫速度 swap所佔率 IO等待率 進程名 15330 be/4 root 673.43 M/s 0.00 B/s 0.00 % 2.07 % dd if=/dev/sda of=/dev/null 1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % init
複製代碼

nice -n nice值 CMD:指定運行時的nice值

renice -n nice值 CMD:調整運行中進程的nice值

vmstat:查看虛擬內存狀態

  • -s: 顯示內存的統計數據
複製代碼
[root@centos7 ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 574860   2080 260516    0    0   105    37  165  179  0  1 99  0  0
複製代碼
  • procs
    • r:可運行(正運行或等待運行)進程的個數
    • b:處於不可中斷睡眠態的進程個數(被阻塞的隊列的長度)
  • memory
    • swpd: 交換內存的使用總量
    • free:空閒物理內存總量
    • buffer:用於buffer的內存總量
    • cache:用於cache的內存總量
  • swap
    • si:從磁盤交換進內存的數據速率(kb/s)
    • so:從內存交換至磁盤的數據速率(kb/s)
  • io
    • bi:從塊設備讀入數據到系統的速率(kb/s)
    • bo: 保存數據至塊設備的速率
  • system
    • in: interrupts 中斷速率,包括時鐘
    • cs: context switch 進程切換速率
  • cpu
    • us:花在運行非內核代碼上的時間
    • sy:花在運行內核代碼上的時間
    • id:閒置的時間
    • wa:等待IO的時間
    • st:被虛擬機盜取的時間

iostat:統計CPU和設備IO信息

dstat:系統資源統計工具

  • -c: 顯示cpu相關信息
  • -d: 顯示disk相關信息
  • -g:顯示page相關統計數據
  • -m: 顯示memory相關統計數據
  • -n: 顯示network相關統計數據
  • -p: 顯示process相關統計數據
  • -r: 顯示io請求相關的統計數據
  • -s: 顯示swapped相關的統計數據
  • --tcp:顯示tcp相關統計數據
  • --udp:顯示udp相關統計數據 
  • --unix:顯示unix-sockets相關統計數據 
  • --raw:顯示raw相關統計數據
  • --socket:顯示socket相關統計數據
  • --ipc:顯示ipc相關統計數據
  • --top-cpu:顯示最佔用CPU的進程
  • --top-io: 顯示最佔用io的進程
  • --top-mem: 顯示最佔用內存的進程
  • --top-latency: 顯示延遲最大的進程

pmap PID:查看進程對應的內存映射  ==  cat /proc/PID/maps

  • -x:顯示詳細信息

glances(epel):調用遠程主機上的系統運行狀態信息

[root@centos7 ~]# yum -q -y install glances #安裝glances軟件包
[root@centos7 ~]# glances -s -B 192.168.0.7 & #啓動服務並監聽端口
[root@centos7 ~]# glances -c 192.168.0.7 #客戶端鏈接

釋放buff/cache空間

echo 1 > /proc/sys/vm/drop_caches 

kill:向進程發送控制信號

  • -n # PID:向進程發信號
  • %做業號:結束做業
  • -l:查看全部信號

經常使用信號:man 7 signal

  • 1:SIGHUP 讓進程重讀配置文件
  • 2:SIGINT 終止信號
  • 3:SIGQUIT ctrl+\,退出信號
  • 9:SIGKILL 強制退出
  • 15:SIGTERM 正常退出,kill默認發送15信號
  • 18:SIGCONT 繼續運行
  • 19:SIGSTOP 中止信號

pkill -n #:向進程發送信號,支持模式匹配,用法和pgrep類似

  • -u uid: effective user,生效者
  • -U uid: real user,真正發起運行命令者
  • -t terminal: 與指定終端相關的進程
  • -P pid: 顯示指定進程的子進程

killall -n # CMD:向進程發送指定信號

jobs:顯示當前終端全部的做業

g [[%]JOB_NUM]:把指定的後臺做業調回前臺

bg [[%]JOB_NUM]:讓送日後臺的做業在後臺繼續運行

當咱們在執行一個時間比較長的前臺任務(如:壓縮大文件,編譯內核等),若是途中網絡中斷會致使咱們的任務執行中斷,此時爲了不這種狀況建議採起如下操做:

  1. nohup CMD &>/dev/null 剝離與終端的關係,若是終端關閉,進程由init(systemd)接管
  2. screen:使用Ctrl + a,d剝離會話,-r恢復會話
相關文章
相關標籤/搜索