32.系统进程和进程管理-ps+uptime+top+lsof+pstree+kill+nice
系统进程和进程管理
什么是进程
进程是已启动的可执行程序的运行实例,进程有以下注册部分:
- 已分配内存的地址空间
- 安全属性,包括所有权凭证和特权凭证
- 程序代码的一个或多个执行线程
- 进程状态
程序是二进制文件。
进程是程序运行的过程,是动态的,是有生命周期的,是由运行状态的。
进程的生命周期

父进程复制自己的地址空间(fork [fɔ:k] 分叉)创建一个新的(子)进程结构。每个新进程分配一个唯一的进程 ID (PID),满足跟踪安全性之需。PID 和 父进程 ID (PPID)是子进程环境的元素,任何进程都可以创建子进程,所有进程都是第一个系统进程的后代。
centos5/centos6:PID为1的进程是init
centos7:PID为1的进程是systemd
僵尸进程:
一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程。
就是父进程退出了, 子进程没有退出, 那么这些子进程就没有父进程来管理了,就变成僵尸进程。
进程的属性有哪些
进程ID(PID):是唯一的数值,用来区分进程
父进程的ID(PPID)
启动进程的用户ID(UID)和所归属的组(GID)
进程状态:状态分为运行R、休眠S、僵尸Z
进程执行的优先级
进程所连接的终端名
进程资源占用:比如占用资源大小(内存、CPU占用量)
ps查看进程工具
语法:ps [参数] 进程
参数:
a:显示跟当前终端关联的所有进程
u:基于用户的进程格式显示,
U:显示某用户ID的所有进程
x:显示所有进程,不以终端来区分
ps –aux | more
查看所有进程
注:最后一列[xxxx] 使用方括号括起来的进程是内核态的进程。没有括起来的是用户态进程。
[root@bogon Desktop]# ps -aux | more
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 191504 4536 ? Ss Dec04 0:21 /usr/lib/syste
md/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S Dec04 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S Dec04 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< Dec04 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S Dec04 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S Dec04 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? S Dec04 0:15 [rcu_sched]
root 10 0.0 0.0 0 0 ? S< Dec04 0:00 [lru-add-drain
]
root 11 0.0 0.0 0 0 ? S Dec04 0:00 [watchdog/0]
root 12 0.0 0.0 0 0 ? S Dec04 0:00 [watchdog/1]
root 13 0.0 0.0 0 0 ? S Dec04 0:00 [migration/1]
root 14 0.0 0.0 0 0 ? S Dec04 0:00 [ksoftirqd/1]
root 16 0.0 0.0 0 0 ? S< Dec04 0:00 [kworker/1:0H]
root 17 0.0 0.0 0 0 ? S Dec04 0:00 [watchdog/2]
root 18 0.0 0.0 0 0 ? S Dec04 0:00 [migration/2]
root 19 0.0 0.0 0 0 ? S Dec04 0:00 [ksoftirqd/2]
root 21 0.0 0.0 0 0 ? S< Dec04 0:00 [kworker/2:0H]
root 22 0.0 0.0 0 0 ? S Dec04 0:00 [watchdog/3]
root 23 0.0 0.0 0 0 ? S Dec04 0:00 [migration/3]
进程中参数解释
USER: 启动这些进程的用户
PID: 进程的ID
%CPU 进程占用的CPU百分比;
%MEM 占用内存的百分比;
VSZ:进程占用的虚拟内存大小(单位:KB)
RSS:进程占用的物理内存大小(单位:KB)
STAT:该程序目前的状态,Linux进程有5种基本状态:
R :该程序目前正在运作,或者是可被运作;
S :该程序目前正在睡眠当中 (可说是 idle 状态啦!),但可被某些讯号(signal) 唤醒。
T :该程序目前正在侦测或者是停止了;
Z :该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态
D :不可中断状态.
<: 表示进程运行在高优先级上
N: 表示进程运行在低优先级上
L: 表示进程有页面锁定在内存中
s: 表示进程是控制进程
l: 表示进程是多线程的
+: 表示当前进程运行在前台
START:该 process 被触发启动的时间;
TIME :该 process 实际使用 CPU 运作的时间。
COMMAND:该程序的实际指令
ps –aux | grep进程名
查看某个进程的状态
[root@bogon ~]# ps -aux | grep a.txt
root 42383 0.1 0.0 149304 5160 pts/0 S+ 00:52 0:00 vim a.txt
root 42450 0.0 0.0 112708 984 pts/2 S+ 00:53 0:00 grep --color=auto a.txt
常用快捷键
Ctrl + C:发送SIGINT信号,终止一个进程
Ctrl + Z:发送SIGSTOP信号,挂起一个进程,将任务放置在后台(暂停进程)
Ctrl + D:表示一个特殊的二进制(EOF),代表输入完成或注销
ps –ef
-e:显示所有进程
-f:显示完整格式输出
举例:
显示所有进程并按照完整格式输出
[root@bogon ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Dec04 ? 00:00:21 /usr/lib/systemd/systemd --swi
root 2 0 0 Dec04 ? 00:00:00 [kthreadd]
root 3 2 0 Dec04 ? 00:00:00 [ksoftirqd/0]
root 5 2 0 Dec04 ? 00:00:00 [kworker/0:0H]
root 7 2 0 Dec04 ? 00:00:00 [migration/0]
root 8 2 0 Dec04 ? 00:00:00 [rcu_bh]
进程中参数解释
UID: 启动这些进程的用户
PID: 进程的ID
PPID: 父进程的进程号
C: 进程生命周期中的CPU利用率
STIME: 进程启动时的系统时间
TTY: 表明进程在哪个终端设备上运行。如果显示 ?表示与终端无关,这种进程一般是内核态进程。另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等,则表示运行在虚拟终端上的进程。
TIME: 运行进程一共累计占用的CPU时间
CMD: 启动的程序名称
ps –ef | grep 进程名
查看某个进程的状态
[root@bogon ~]# ps -ef | grep a.txt
root 42383 23328 0 00:52 pts/0 00:00:00 vim a.txt
root 42954 42389 0 01:01 pts/2 00:00:00 grep --color=auto a.txt
ps –aux 与ps –ef对比
ps –aux:是用BSD的格式来显示进程。
ps –ef:是用标准的格式显示进程。
uptime查看CPU负载工具
[root@bogon ~]# uptime
01:03:17 up 19:02, 4 users, load average: 0.00, 0.01, 0.05
显示信息的解释
|
13:22:30 |
当前时间 |
|
up 20days |
系统运行时间,说明此服务器连续运行20天了 |
|
2 user |
当前登录用户数 |
|
load average: 0.06, 0.60, 0.48 |
系统负载,即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。 |
计算CPU是否负载过高
如果服务器的CPU为1核心,则load average中的数字>=3则负载过高;
如果服务器的CPU为4核心,则load average中的数字>=12则负载过高。
top命令
[root@bogon ~]# top
top - 01:07:54 up 19:07, 4 users, load average: 0.00, 0.01, 0.05
Tasks: 259 total, 1 running, 258 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 7990280 total, 6093700 free, 846664 used, 1049916 buff/cache
KiB Swap: 5242876 total, 5242876 free, 0 used. 6736400 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8961 root 20 0 320028 6764 5272 S 0.3 0.1 1:56.38 vmtoolsd
8985 root 20 0 21680 1308 988 S 0.3 0.0 0:11.27 irqbalance
43326 root 20 0 162132 2404 1592 R 0.3 0.0 0:00.06 top
1 root 20 0 191504 4536 2636 S 0.0 0.1 0:21.93 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.07 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.11 ksoftirqd+
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0+
7 root rt 0 0 0 0 S 0.0 0.0 0:00.07 migration+
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 0:16.22 rcu_sched
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-d+
11 root rt 0 0 0 0 S 0.0 0.0 0:00.59 watchdog/0
12 root rt 0 0 0 0 S 0.0 0.0 0:00.50 watchdog/1
13 root rt 0 0 0 0 S 0.0 0.0 0:00.26 migration+
14 root 20 0 0 0 0 S 0.0 0.0 0:00.25 ksoftirqd+
16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/1+
显示信息解释
第一行
top - 01:07:54 up 19:07, 4 users, load average: 0.00, 0.01, 0.05
表示:
|
13:22:30 |
当前时间 |
|
up 20days |
系统运行时间,说明此服务器连续运行20天了 |
|
2 user |
当前登录用户数 |
|
load average: 0.06, 0.60, 0.48 |
系统负载,即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。 |
第二、第三行
Tasks: 259 total, 1 running, 258 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
当有多个CPU时,这些内容可能会超过两行。
表示:
|
Tasks: 481 total |
进程总数 |
|
1 running |
正在运行的进程数 |
|
480 sleeping |
睡眠的进程数 |
|
0 stopped |
停止的进程数 |
|
0 zombie |
僵尸进程数 |
|
Cpu(s): 0.0% us |
系统用户进程使用CPU百分比。 |
|
0.0% sy |
内核中的进程占用CPU百分比 |
|
0.0% ni |
用户进程空间内改变过优先级的进程占用CPU百分比 |
|
98.7% id |
空闲CPU百分比 |
|
0.0% wa |
cpu等待I/0完成的时间总量。 测试: 终端1:执行:top 终端2:dd if=/dev/zero of=/a.txt count=10 bs=100M 终端3:dd if=/dev/zero of=/a.txt count=10 bs=100M 如下:
|
|
0.0% hi(了解) 硬中断消耗时间
|
硬中断,占的CPU百分比。1. 硬中断是由硬件产生的,比如,像磁盘,网卡,键盘,时钟等。每个设备或设备集都有它自己的IRQ(中断请求)。基于IRQ,CPU可以将相应的请求分发到对应的硬件驱动上(注:硬件驱动通常是内核中的一个子程序,而不是一个独立的进程)。# hi -> Hardware IRQ: The amount of time the CPU has been servicing hardware interrupts. |
|
0.0% si(了解) 软中断消耗时间 |
软中断,占的CPU百分比。1. 通常,软中断是一些对I/O的请求。这些请求会调用内核中可以调度I/O发生的程序。对于某些设备,I/O请求需要被立即处理,而磁盘I/O请求通常可以排队并且可以稍后处理。根据I/O模型的不同,进程或许会被挂起直到I/O完成,此时内核调度器就会选择另一个进程去运行。I/O可以在进程之间产生并且调度过程通常和磁盘I/O的方式是相同。# si -> Software Interrupts.: The amount of time the CPU has been servicingsoftware interrupts. |
|
0.0 st (steal 偷) |
st:虚拟机偷取物理的时间。比如:物理机已经运行了KVM,XEN虚拟机。KVM虚拟机占用物理机的cpu时间 |
第四、第五行
KiB Mem : 7990280 total, 6093700 free, 846664 used, 1049916 buff/cache
KiB Swap: 5242876 total, 5242876 free, 0 used. 6736400 avail Mem
|
Mem: 2033552k total |
物理内存总量 |
|
340392k used |
使用的物理内存总量 |
|
1376636k free |
空闲内存总量 |
|
316524k buff/cache |
用作内核缓存的内存量。 和free -k 一个意思
|
|
Swap: 2017948k total |
交换区总量 |
|
0k used |
使用的交换区总量 |
|
192772k free |
空闲交换区总量 |
|
1518148 avail Mem |
总的可利用内存是多少 |
第六行
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
|
列名 |
含义 |
|
PID |
进程id |
|
USER |
进程所有者的用户名 |
|
PR |
优先级(由内核动态调整),用户不能 |
|
NI |
进程优先级。 nice值。负值表示高优先级,正值表示低优先级,用户可以自己调整 |
|
VIRT(virtual memory usage) |
虚拟内存,是进程正在使用的所有内存(ps中标为VSZ) VIRT:virtual memory usage 虚拟内存 1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等 2、假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量 |
|
RES(resident memory usage) |
是进程所使用的物理内存。实际实用内存(ps中标为RSS) RES:resident memory usage 常驻内存 1、进程当前使用的内存大小,但不包括swap out 2、包含其他进程的共享 3、如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反 4、关于库占用内存的情况,它只统计加载的库文件所占内存大小 |
|
SHR |
共享内存大小,单位kb SHR:shared memory 共享内存 1、除M了自身进程的共享内存,也包括其他进程的共享内存 2、虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小 3、计算某个进程所占的物理内存大小公式:RES – SHR 4、swap out后,它将会降下来 |
|
S |
进程状态。 |
|
%CPU |
上次更新到现在的CPU时间占用百分比 |
|
%MEM |
进程使用的物理内存百分比 |
|
TIME+ |
进程使用的CPU时间总计,单位1/100秒 |
|
COMMAND |
命令名/命令行 |
top快捷键
按空格:立即刷新。
q:退出
P:按CPU排序
M:按内存排序
T:按时间排序
p: 进程IP,查看某个进程状态
数字键1:显示每个内核的CPU使用率
u/U:指定显示的用户
h:帮助
使用top只查看某个或某些进程信息
先使用“ps –aux | grep 进程”查找到该进程的ID
[root@bogon ~]# ps -aux | grep vim
root 42383 0.0 0.0 149304 5160 pts/0 S+ 00:52 0:00 vim a.txt
root 44014 0.0 0.0 112712 972 pts/2 S+ 01:19 0:00 grep --color=auto vim
然后使用“top –p ID号”查看该进程的动态信息
[root@bogon ~]# top -p 42383
top - 01:20:09 up 19:19, 4 users, load average: 0.00, 0.01, 0.05
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 7990280 total, 6093388 free, 846772 used, 1050120 buff/cache
KiB Swap: 5242876 total, 5242876 free, 0 used. 6736076 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
42383 root 20 0 149304 5160 2572 S 0.0 0.1 0:00.02 vim
lsof命令
语法:lsof [参数] 端口/进程ID
参数:
-i:列出符合条件的进程(进程:协议、:端口号、@IP地址)
-p:列出指定进程号
lsof –i :端口号
列出包含该端口的所以进程信息
[root@bogon ~]# lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 9349 root 3u IPv4 51785 0t0 TCP *:ssh (LISTEN)
sshd 9349 root 4u IPv6 51787 0t0 TCP *:ssh (LISTEN)
sshd 23305 root 3u IPv4 179294 0t0 TCP bogon:ssh->bogon:63693 (ESTABLISHED)
lsof –p 进程ID
列出含有该进程ID的所有进程
[root@bogon ~]# lsof -p 42383
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
vim 42383 root cwd DIR 8,3 106 67164794 /root/Desktop
vim 42383 root rtd DIR 8,3 277 64 /
vim 42383 root txt REG 8,3 2294216 102026522 /usr/bin/vim
pstree工具
pstree以树状图显示进程,只显示进程的名字。相同进程将会合并显示。
pstree
[root@bogon ~]# pstree
systemd─┬─ModemManager───2*[{ModemManager}]
├─NetworkManager─┬─dhclient
│ └─2*[{NetworkManager}]
├─VGAuthService
├─2*[abrt-watch-log]
├─abrtd
├─accounts-daemon───2*[{accounts-daemon}]
├─alsactl
├─at-spi-bus-laun─┬─dbus-daemon
│ └─3*[{at-spi-bus-laun}]
├─at-spi2-registr───2*[{at-spi2-registr}]
├─atd
├─auditd─┬─audispd─┬─sedispatch
pstree –p
[root@bogon ~]# pstree -p
systemd(1)─┬─ModemManager(8980)─┬─{ModemManager}(9034)
│ └─{ModemManager}(9041)
├─NetworkManager(8984)─┬─dhclient(38080)
│ ├─{NetworkManager}(9057)
│ └─{NetworkManager}(9061)
前后台进程的切换
Linux后台进程与前台进程的区别
前台进程:
是在终端中运行的命令,那么该终端就为进程的控制终端,一旦这个终端关闭,这个进程也随着消失。
后台进程:
也叫守护进程(Daemon),是运行在后台的一种特殊进程,不受终端控制,它不需要与终端交互。
系统任务相关命令
|
& |
用在一个命令的最后,可以把这个命令放到后台执行. |
|
ctrl + z |
将一个正在前台执行的命令放到后台,并且暂停. |
|
jobs |
查看当前有多少在后台运行的进程.它是一个作业控制命令 |
|
Fg(foreground process) |
将后台中的命令调至前台继续运行, 如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid) |
|
bg(background process) |
将一个在后台暂停的命令,变成继续执行; 如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid) |
命令举例:
[root@bogon ~]# jobs
[root@bogon ~]# fg 1
kill关闭进程
关闭进程有3个命令,可以通过这3个命令实现关闭进程。
kill –l
列出所有支持的信号,用的最多的是9(SIGKILL)信号
[root@bogon ~]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
常用信号解释
1) SIGHUP 重新加载配置
2) SIGINT 键盘中断 crtl+c
3) SIGQUIT 退出
9) SIGKILL 强制终止
15)SIGTERM 终止(正常结束),缺省信号
18)SIGCONT 继续
19)SIGSTOP 停止
20)SIGTSTP 暂停 crtl+z
kill -9 进程ID
终止某个进程
[root@bogon ~]# kill -9 45516
killall 进程名
[root@bogon ~]# killall vim
pkill 进程名
[root@bogon ~]# pkill vim
nice进程优先管理
进程的优先级取值范围是(-2-到19),值越小优先级越高,默认优先级是0.
nice –n 数值 进程
指定程序的运行优先级
[root@localhost Desktop]# nice -n 5 vim a.sh
[1]+ Stopped nice -n 5 vim a.sh
[root@localhost ~]# ps -aux | grep vim
root 46776 0.2 0.0 149456 5428 pts/2 TN 14:32 0:00 vim a.sh
root 46810 0.0 0.0 112708 972 pts/0 S+ 14:33 0:00 grep --color=auto vim
[root@localhost ~]# top -p 46776
top - 14:33:29 up 19:59, 4 users, load average: 0.01, 0.11, 0.10
Tasks: 1 total, 0 running, 0 sleeping, 1 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 7990280 total, 6092100 free, 845696 used, 1052484 buff/cache
KiB Swap: 5242876 total, 5242876 free, 0 used. 6737552 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
46776 root 25 5 149456 5428 2628 T 0.0 0.1 0:00.06 vim
renice 数值 进程号
改变正在运行的进程的优先级
[root@localhost ~]# renice -10 46776
46776 (process ID) old priority 5, new priority -10
[root@localhost ~]# top -p 46776
top - 14:35:40 up 20:02, 4 users, load average: 0.00, 0.07, 0.09
Tasks: 1 total, 0 running, 0 sleeping, 1 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 7990280 total, 6092304 free, 845452 used, 1052524 buff/cache
KiB Swap: 5242876 total, 5242876 free, 0 used. 6737748 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
46776 root 10 -10 149456 5428 2628 T 0.0 0.1 0:00.06 vim



浙公网安备 33010602011771号