首页 > 代码库 > Linux进程管理
Linux进程管理
1、 进程管理的基础概念
什么是进程
顾名思义,进程是指当前系统运行的程序,每个进程有唯一的标识符PID,进程由内核管理通过task_struck和task_list来调度和管理的。
内核的定义及功能
内核是操作系统的核心,控制的计算机的基本硬件,所有程序和CPU、内存等计算机硬件通讯都需要向内核申请。内核负责进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能。
进程创建
Linux所有进程都是通过init创建,init是所有进程的父进程,父进程的子进程必须又父进程来关闭,如果父进程被关闭,子进程也会被关闭。进程创建方法由三种:fork()、clone()、vfork()。fork()通过克隆的方式创建子进程,但是子进程拥有自己的结构和 PID,修改子进程的配置文件,并不会影响父进程;系统调用fork()和vfork()是无参数的,而clone()则带有参数,clone()会有选择的将父进程的资源复制给子进程,没有复制的部分将通过指针共享;vfork()创建的子进程会与父进程共享空间和资源,子进程的变量修改会直接影响父进程。
进程优先级
进程的优先级在系统中通过数字0-139表示,数字越小优先级越高。
0:为所有进程的父进程
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频率较高。
2、 进程查看管理工具详解
常用的进程管理命令和工具有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:与用户终端相关的进程
x:与用户终端无关的进程
[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:低优先级进程
<:高优先级进程
s:session leader
常用组合:-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
本文出自 “学海无涯” 博客,请务必保留此出处http://mwdmwz.blog.51cto.com/814369/1931879
Linux进程管理