一、 進程管理的基礎概念shell
什麼是進程centos
顧名思義,進程是指當前系統運行的程序,每一個進程有惟一的標識符PID,進程由內核管理經過task_struck和task_list來調度和管理的。安全
內核的定義及功能bash
內核是操做系統的核心,控制的計算機的基本硬件,全部程序和CPU、內存等計算機硬件通信都須要向內核申請。內核負責進程管理、文件系統、網絡功能、內存管理、驅動程序、安全功能。網絡
進程建立session
Linux全部進程都是經過init建立,init是全部進程的父進程,父進程的子進程必須又父進程來關閉,若是父進程被關閉,子進程也會被關閉。進程建立方法由三種:fork()、clone()、vfork()。fork()經過克隆的方式建立子進程,可是子進程擁有本身的結構和 PID,修改子進程的配置文件,並不會影響父進程;系統調用fork()和vfork()是無參數的,而clone()則帶有參數,clone()會有選擇的將父進程的資源複製給子進程,沒有複製的部分將經過指針共享;vfork()建立的子進程會與父進程共享空間和資源,子進程的變量修改會直接影響父進程。多線程
進程優先級app
進程的優先級在系統中經過數字0-139表示,數字越小優先級越高。ssh
0:爲全部進程的父進程socket
1-99:顯示進程的實時優先級,爲內核調度,動態分配
100-139:顯示進程的靜態優先級
Nice值:調整進程靜態優先級,nice值範圍爲-20,19,依次對應100-139,負值爲高優先級,正值爲低優先級,0表示不調整優先級。
進程通訊(Inter process communication)
同主機經過singnal(信號)、shared memory(共享內存)、semerphore(旗語)來通信,若是不在贊成主機上須要經過remote procecure call(RPC遠程通信協議)、socket(套接字)來通訊。
進程管理機制
Linux內核的特色是Preemption(搶佔)多任務運行,這種搶佔不須要徵求正在運行的進程的贊成而強制打斷。
進程的類型分爲一下兩種:
守護進程:在系統引導過程當中啓動的進程,跟終端無關,通常稱之爲後臺進程;
前臺進程:跟終端相關,經過終端啓動的進程,通常稱之爲前臺進程,能夠將前臺進程送日後臺,以守護模式運行
進程運行狀態主要有如下幾種:
running:運行態
ready:就緒態
睡眠態:睡眠態分爲interruptable(可中斷睡眠)和uninterruptable(不可中斷睡眠),可中斷睡眠表示隨時能夠喚醒的,不可中斷失眠表示不能隨時喚醒的,通常不可中斷睡眠發生在外部條件不知足,沒法繼續進行時,例如磁盤I/O的時候。
stopped:中止態,暫停於內存中,但不會被調度,除非手動啓動
zomble:僵死態,每一個進程都由其父進程建立,子進程銷燬後由父進程進行回收,可是父進程被銷燬於子進程以前,則該子進程被稱爲僵死進程。
進程分類:
CPU-Bound:計算密集型,只大部分時間用來計算,I/O一直處於等待中的較多;
IO-Bound:只CPU一直出於等待中中,IO頻率較高。
二、 進程查看管理工具詳解
經常使用的進程管理命令和工具備pstree、ps、pidof、top、htop、glances、pmap、vmstat、dstat、kill、pkill、job、bg、fg、nohup
2.1 pstree
功能:使用樹型顯示進程
用法:pstree
示例:
[root@localhost ~]# pstree
systemd─┬─ModemManager───2*[{ModemManager}]
├─NetworkManager─┬─dhclient
│ └─2*[{NetworkManager}]
├─2*[abrt-watch-log]
├─abrtd
├─accounts-daemon───2*[{accounts-daemon}]
├─alsactl
├─at-spi-bus-laun─┬─dbus-daemon───{dbus-daemon}
│ └─3*[{at-spi-bus-laun}]
├─at-spi2-registr───{at-spi2-registr}
├─atd
├─auditd─┬─audispd─┬─sedispatch
│ │ └─{audispd}
│ └─{auditd}
├─avahi-daemon───avahi-daemon
├─bluetoothd
├─caribou───2*[{caribou}]
├─colord───2*[{colord}]
├─crond
├─cupsd
├─2*[dbus-daemon───{dbus-daemon}]
├─dbus-launch
├─dconf-service───2*[{dconf-service}]
├─dnsmasq───dnsmasq
├─evolution-calen───5*[{evolution-calen}]
├─evolution-sourc───2*[{evolution-sourc}]
├─firewalld───{firewalld}
├─gconfd-2
├─gdm─┬─Xorg
│ ├─gdm-session-wor─┬─gnome-session─┬─abrt-applet───{abrt-applet}
│ │ │ ├─gnome-settings-───4*[{gnome-settings-}]
│ │ │ ├─gnome-shell─┬─ibus-daemon─┬─ibus-dconf───3*[{ibus-dconf}]
│ │ │ │ │ ├─ibus-engine-sim───2*[{ibus-engine-sim}]
│ │ │ │ │ └─2*[{ibus-daemon}]
│ │ │ │ └─6*[{gnome-shell}]
│ │ │ ├─gnome-software───3*[{gnome-software}]
│ │ │ ├─nautilus───3*[{nautilus}]
│ │ │ ├─seapplet
│ │ │ ├─ssh-agent
│ │ │ ├─tracker-extract───13*[{tracker-extract}]
│ │ │ ├─tracker-miner-a───2*[{tracker-miner-a}]
│ │ │ ├─tracker-miner-f───3*[{tracker-miner-f}]
│ │ │ ├─tracker-miner-u───2*[{tracker-miner-u}]
│ │ │ └─3*[{gnome-session}]
│ │ └─2*[{gdm-session-wor}]
│ └─3*[{gdm}]
├─gnome-keyring-d───4*[{gnome-keyring-d}]
├─gnome-shell-cal───4*[{gnome-shell-cal}]
├─gnome-terminal-─┬─bash
│ ├─gnome-pty-helpe
│ └─3*[{gnome-terminal-}]
├─goa-daemon───3*[{goa-daemon}]
├─goa-identity-se───2*[{goa-identity-se}]
├─gsd-printer───{gsd-printer}
├─gssproxy───5*[{gssproxy}]
├─gvfs-afc-volume───2*[{gvfs-afc-volume}]
├─gvfs-goa-volume───{gvfs-goa-volume}
├─gvfs-gphoto2-vo───{gvfs-gphoto2-vo}
├─gvfs-mtp-volume───{gvfs-mtp-volume}
├─gvfs-udisks2-vo───2*[{gvfs-udisks2-vo}]
├─gvfsd───{gvfsd}
├─gvfsd-fuse───4*[{gvfsd-fuse}]
├─gvfsd-metadata───{gvfsd-metadata}
├─gvfsd-trash───2*[{gvfsd-trash}]
├─httpd───5*[httpd]
├─ibus-x11───2*[{ibus-x11}]
├─ksmtuned───sleep
├─libvirtd───15*[{libvirtd}]
├─lsmd
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─mission-control───2*[{mission-control}]
├─packagekitd───2*[{packagekitd}]
├─polkitd───5*[{polkitd}]
├─pulseaudio───2*[{pulseaudio}]
├─rngd
├─rsyslogd───2*[{rsyslogd}]
├─rtkit-daemon───2*[{rtkit-daemon}]
├─smartd
├─sshd───sshd───bash───pstree
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tracker-store───7*[{tracker-store}]
├─tuned───4*[{tuned}]
├─udisksd───4*[{udisksd}]
├─upowerd───2*[{upowerd}]
├─vmtoolsd───{vmtoolsd}
├─vmtoolsd
└─wpa_supplicant
2.2 pstree
用途:report a snapshot of the current processes(當前進程快照的報告)
語法:ps [option]…
選項:
經常使用組合:aux
u:以用戶爲中心組織進程狀態信息的顯示
a:與用戶終端相關的進程
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
命令顯示內容解析:
VSZ: Virtual memory Size ,虛擬內存集
RSS: Resident size ,常駐內存集
STAT:進程狀態
R:running,運行態
S:interruptable sleeping,可中斷睡眠
D:uninterruptable sleeping,不可中斷睡眠
T:stopped,中止態
Z:zamble,僵死態
+:前臺進程
l:多線程進程
N:低優先級進程
<:高優先級進程
經常使用組合:-ef
-e : 顯示全部的進程
-f :顯示完整格式的程序信息
經常使用組合:-eFH
-F : 顯示完整格式的進程信息
-H : 以進程層級格式顯示進程的相關信息
經常使用組合:-eo,axo
-eo : pid , tid , class , rtprio , ni ,pri , psr , pcup , stat , comm
-axo : stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
ni: nice值
pri : priority ,優先級
prs: processor ,cpu
rtprio:實時優先級
2.2 pgrep,pkill
用途:
pgrep : 以名稱爲依據顯示對應進程的PID
pkill:殺死運行中的進程
格式:
pgrep[ option ] pattern
pkill [ option ] pattern
選項:
-u uid : effective user
-U uid : real user
-t terminal : 與指定終端相關的進程
-l :顯示進程名
-a :顯示完整格式的進程名
-p pid : 顯示其父進程爲此處指定的進程的進程列表
2.3 pidof
用途:根據進程名獲取其PID
2.4 top
內置命令
排序
P:以佔據的CPU顯示百分比
M:以佔據的內存百分比
T:累計佔據CPU時長
首部信息顯示
Uptime信息:l
task及CPU信息:t
CPU分別顯示:1
Memory信息:m
退出命令:q
更改刷新時間:s
殺死進程:k
選項:
-d:指定刷新間隔,默認爲3s
-b:以批次方式顯示
-n #:顯示多少批次
2.5 htop
用途:功能和top同樣,可是更強大,顯示更直觀。
安裝方法:htop並非centos自帶工具,須要配置EPEL源,而後使用yum安裝,安裝過程以下:
在/etc/yum.repos.d目錄下新建一個以.repo結尾的文件,例如CentOS-EPEL.repo
[root@localhost yum.repos.d]# vi /etc/yum.repos.d/CentOS-EPEL.repo
[EPEL] ####yum源描述
name=EPEL ####yum源名稱
baseurl=http://dl.fedoraproject.org/pub/epel/7/x86_64/ ####yum源地址
gpgcheck=0 ####是否檢查檢查來源合法性,0爲不檢查,1爲檢查
enable=1 ####是否啓用此yum源
yum –y install htop
選項:
-d #:指定刷新時間間隔,默認爲3s
-b:以批次方式顯示
-n # :顯示多少批次
命令:
s:跟蹤選定進程的系統調用
l:顯示選定進程打開的文件列表
a:將進程綁定在指定CPU核心上
t:顯示進程樹
2.5 vmstat
用途:報告虛擬內存狀態
格式:vmstat [ options ] [ delay [ conut ] ]
[root@localhost yum.repos.d]# vmstat
procs ----------------memory------------------ ---swap-- -----io------------ -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
3 0 0 876260 1368 638152 0 0 8 2 43 70 0 0 99 0 0
procs:
r:等待運行的進程個數
b:出於不可中斷睡眠的進程個數(被阻塞的隊列長度)
memeory:
swpd:交換分區的使用總量
free:空閒的物理內存總量
buffer:用於buffer的內存總量
cache:用於cache的內存總量
swap:
si:數據進入swap中的數據速率(kb/s)
so:數據離開swap中的數據速率(kb/s)
io:
bi:從塊設備讀取數據的速率(kb/s)
bo:保存數據到數據塊的速率(kb/s)
system:
cs(centext switch):進程切換的速率
in(interrupts):中斷速率
cpu:
us:用戶空間
sy:內核空間
id:空閒比例
wa:等待運行進程的個數
st:別虛擬化佔據的時間比例
選項:
-s:顯示內存的統計數據
2.6 pmap命令
用途:報告進程佔用內存空間的明細圖
格式:pmap [ option ] pid [ … ]
選項:
-x:顯示詳細格式的信息
也可經過 cat /proc/PID/maps來查看,功能等同於pmap
2.7 glances
用途:監控本地或遠程主機系統的CPU、內存、交換分區、網絡、進程等相關參數。
安裝:須要先配置EPEL源,而後使用yum安裝,EPEL配置方法請參考2.5
格式:glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [--password] [-t refresh] [-f file] [-o output]
內建命令
a Sort processes automatically l Show/hide logs
c Sort processes by CPU% b Bytes or bits for network I/O
m Sort processes by MEM% w Delete warning logs
p Sort processes by name x Delete warning and critical logs
i Sort processes by I/O rate 1 Global CPU or per-CPU stats
d Show/hide disk I/O stats h Show/hide this help screen
f Show/hide file system stats t View network I/O as combination
n Show/hide network stats u View cumulative network I/O
s Show/hide sensors stats z Show/hide processes list
y Show/hide hddtemp stats q Quit (Esc and Ctrl-C also work)
經常使用選項:
-b :以byte爲單位顯示網卡速率
-d :關閉磁盤I/O模塊
-f /path/to/somfile :設定輸入文件的位置
-o {HTML|CSV}:輸出格式
-m:禁用mount模塊
-n:禁用網絡模塊
-t #:延時時間間隔
-1:每一個cpu的相關數據單獨顯示
C/S模式下glances使用方法:
服務模式:
[root@localhost ~]# glances -s -B IPADDR(本地監聽的IP地址)
Glances server is running on IPADDR:61209
客戶端模式:
[root@localhost ~]# glances -c IPADDR(服務端IP地址)
2.8 dstat
用途:生成系統資源統計
格式:dstat [-afv] [options..] [delay [count]]
生成信息解析:
[root@localhost ~]# dstat
You did not select any stats, using -cdngy by default.
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
0 0 99 0 0 0|6504B 1665B| 0 0 | 0 0 | 43 68
0 1 99 0 0 0| 0 0 | 180B 934B| 0 0 | 35 47
0 0 100 0 0 0| 0 0 | 60B 346B| 0 0 | 29 31
Total cpu usage:
usr:用戶空間
sys:內核空間
idl:空閒比例
hiq:硬中斷次數
siq:軟中斷次數
dsk/total:
read:從塊設備讀取數據的速率
writ:數據寫入塊設備的速率
net/total:
recv:當前網絡接收數據包接受的速率,以kb/s爲單位
send:當前網絡發送數據包的速率,以kb/s爲單位
paging:
in:換進
out:換出
system:
int:系統中斷次數
csw:安全上下文切換次數
選項:
-c:顯示CPU相關統計數據
-C:當cpu有多個是可使用 –C 0,1…,total分別顯示多塊cpu狀態
-d:顯示硬盤相關信息
-D:當硬盤有多塊時可使用 –D hda1,…,total分別顯示多塊硬盤狀態
-g:顯示page相關統計數據
-m:顯示memory相關統計數據
-n:顯示network相關統計數據
-p:顯示process相關統計數據
-r:顯示IO相關統計數據
-s:顯示swapped相關的統計數據
--tcp:顯示TCP協議相關統計數據
--udp:顯示UDP協議相關的統計數據
--unix:顯示unix協議相關的統計數據
--socket:顯示套接字相關的統計數據
--top-tcp:顯示CPU佔用最高的進程
--top-mem:顯示內存佔用最高的進程
--top-io:顯示IO佔用最高的進程
--top-lantency:顯示最大延遲的進程
--out-file /path/to/file.csv:能夠將信息輸出至指定的csv文件便於之後查看。
2.9 kill
用途:向進程發送控制信號,以實現對進程的管理
顯示當前系統可用信號:
# kill -l
#man 7 signal
經常使用信號:
1) SIGHUB:無需關閉進程而讓其從新讀取配置文件
2) SIGINT:停止正在運行的進程,至關於Ctrl+c
9) SIGKILL:殺死正在運行的進程
15) SIGTERM:終止正在運行的進程
18) SIGCONT:將中止的進程繼續運行
19) SIGSTOP:中止進程
指定信號的方法:
(1) 信號的數字標識 1,2,9
(2) 信號完整名稱 SIGHUB
(3) 信號簡寫名稱 HUB
進程發送信號格式:
# kill [ - signal ] pid
終止名稱下的全部進程:
# killall [ - signal ] Program
2.10 Linux做業控制
做業類型一般分爲兩種:
前臺做業:經過終端啓動,且啓動後一直佔據終端
後臺做業:能夠經過終端啓動,但啓動後即轉入後臺(釋放終端);
讓做業運行於後臺有兩種方法:
(1) 運行中的做業
Ctrl+z
(2) 還沒有運行的做業
# COMMAND &
此類做業雖然被送日後臺但依然與終端相關,若是但願送日後臺後,剝離與終端的關係:
# nohub COMMAND &
查看全部做業:
# jobs
做業控制:
# fg [ % ] [job_num ] :把指定的後臺做業調回到前臺
# bg [ % ] [ job_num]:把送日後臺的進程在後臺繼續運行
# kill [ % job_num]:終止指定的做業
2.11 進程優先級調整
Nice命令
用途:調整進程靜態優先級,靜態優先級爲100-139,用nice值表示依次對應-20 – 19,進程默認啓動時nice值爲0,優先級爲120
格式:nice [ option ] [ command [ ARG ] …]
示例:# nice –10 htop ####以-10的nice值運行htop進程
Renice命令
用途:重置設置進程的nice值
格式:renice [ -n ] priority pid…
示例:# renice -1 33508 ####將進程號33508的進程的nice值變動爲-1
查看nice值的方法
# ps axo pid,comm,ni