进程


进程

  • 进程概述和ps管理进程

    • 什么是进程
    • ps -aux
    • ps -ef
  • uptime查看系统负载
  • top
  • 前后台进程切换 nice进程优先级

进程概述和ps管理进程

什么是进程?

进程是已启动的可执行程序的运行实例,进程有以下组成部分:

  • 已分配内存的地址空间;
  • 安全属性,包括所有权凭据和特权;
  • 程序代码的一个或多个执行线程;
  • 进程状态
程序二进制文件,静态 /bin/date,/usr/sbin/sshd
进程是程序运行的过程, 动态,有生命周期及运行状态。

下图所示的是进程的生命周期:

描述如下:父进程复制自己的地址空间(fork [fɔ:k] 分叉)创建一个新的(子)进程结构。每个新进程分配一个唯一的进程 ID (PID),满足跟踪安全性之需。
PID 和 父进程ID(PPID)是子进程环境的元素,任何进程都可以创建子进程,所有进程都是第一个系统进程的后代。

centos5或6PID为1的进程是: init
centos7 PID为1的进程是: systemd

僵尸进程:僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的相关资源。

进程的属性

  • 进程ID(PID):是唯一的数值,用来区分进程
  • 父进程的ID(PPID)
  • 启动进程的用户ID(UID)和所归属的组(GID)
  • 进程状态:状态分为运行R、休眠S、僵尸Z
  • 进程执行的优先级
  • 进程所连接的终端名
  • 进程资源占用:比如占用资源大小(内存、CPU占用量)

ps -aux

  • a: 显示跟当前终端关联的所有进程
  • u: 基于用户的格式显示(U: 显示某用户ID所有的进程)
  • x: 显示所有进程,不以终端机来区分
[root@love ~]# ps -axu | more

注:最后一列[xxxx] 使用方括号括起来的进程是内核态的进程。 没有括起来的是用户态进程。

上面的参数输出每列含意:

USER启动这些进程的用户
PID进程的ID
%CPU进程占用的CPU百分比;
%MEM占用内存的百分比;
VSZ进程占用的虚拟内存大小(单位:KB)
RSS进程占用的物理内存大小(单位:KB)
STAT该程序目前的状态,Linux进程有5种基本状态:

5种基本状态

R该程序目前正在运作,或者是可被运作;
S该程序目前正在睡眠当中 (可说是 idle 状态啦!),但可被某些讯号(signal) 唤醒。
T该程序目前正在侦测或者是停止了;
Z该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态
D不可中断状态.

5个基本状态后,还可以加一些字母,比如:Ss、R+,如下图:

它们含意如下:

  • <: 表示进程运行在高优先级上
  • N: 表示进程运行在低优先级上
  • L: 表示进程有页面锁定在内存中
  • s: 表示进程是控制进程
  • l: 表示进程是多线程的
  • +: 表示当前进程运行在前台
  • START:该 process 被触发启动的时间;
  • TIME :该 process 实际使用 CPU 运作的时间。
  • COMMAND:该程序的实际指令

例:查看进程状态

[root@love ~]# vim a.txt
# 在另一个终端执行:
[root@love ~]# ps -aux | grep a.txt # 查看状态 S表示睡眠状态, + 表示前台
root 4435 0.0 0.2 151752 5292 pts/1 S+ 20:52 0:00 vim a.txt
root 4661 0.0 0.0 112676 996 pts/0 S+ 21:05 0:00 grep --color=auto a.txt
# 在vim a.txt 这个终端上 按下: ctrl+z  
[1]+ 已停止 vim a.txt
# 在另一个终端执行:
[root@love ~]# ps -aux | grep a.txt # 查看状态 T表示停止状态
root 4435 0.0 0.2 151752 5292 pts/1 T 20:52 0:00 vim a.txt
root 4675 0.0 0.0 112676 996 pts/0 S+ 21:05 0:00 grep --color=auto a.txt

注:

  • ctrl-c 是发送 SIGINT 信号,终止一个进程
  • ctrl-z 是发送 SIGSTOP信号,挂起一个进程。将作业放置到后台(暂停)
  • ctrl-d 不是发送信号,而是表示一个特殊的二进制值,表示 EOF。代表输入完成或者注销

ps -ef

  • -e 显示所有进程
  • -f 显示完整格式输出

包含的信息如下:

UID启动这些进程的用户
PID进程的ID
PPID父进程的进程号
C进程生命周期中的CPU利用率
STIME进程启动时的系统时间
TTY表明进程在哪个终端设备上运行。如果显示 ?表示与终端无关,这种进程一般是内核态进程。另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等,则表示运行在虚拟终端上的进程。
TIME运行进程一共累计占用的CPU时间
CMD启动的程序名称

注:

ps aux 是用BSD的格式来显示进程。

ps -ef 是用标准的格式显示进程

uptime查看系统负载

uptime查看CPU负载工具

[root@localhost ~]# uptime
13:22:30 up 20days, 2 users, load average: 0.06, 0.60, 0.48

弹出消息含意如下:

13:22:30当前时间
up 20days系统运行时间 ,说明此服务器连续运行20天了
2 user当前登录用户数
load average: 0.06, 0.60, 0.48系统负载,即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。

如果服务器的CPU为1核心,则load average中的数字 >=3 负载过高
如果服务器的CPU为4核心,则load average中的数字 >=12 负载过高
经验:单核心,1分钟的系统平均负载不要超过3就可以,这是个经验值

top命令

[root@love ~]# top

top弹出的每行信息含意如下:
第一行内容和uptime弹出的信息一样;进程和CPU的信息( 第二、三行)

当有多个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% wacpu等待I/0完成的时间总量。
0.0% hi 硬中断消耗时间硬中断,占的CPU百分比。
0.0% si 软中断消耗时间软中断,占的CPU百分比。
0.0 stst:虚拟机偷取物理的时间。比如:物理机已经运行了KVM,XEN虚拟机。KVM虚拟机占用物理机的cpu时间

内存信息(第四五行)

内容如下:

Mem: 2033552k total物理内存总量
340392k used使用的物理内存总量
1376636k free空闲内存总量
316524k buff/cache用作内核缓存的内存量 和free -k 一个意思
Swap: 2017948k total交换区总量
0k used使用的交换区总量
192772k free空闲交换区总量
1518148 avail Mem总的可利用内存是多少

注:如果swap分区,被使用,那么你的内存不够用了。

第7行进程信息

列名含义
PID进程id
USER进程所有者的用户名
PR优先级(由内核动态调整),用户不能
NI进程优先级。 nice值。负值表示高优先级,正值表示低优先级,用户可以自己调整
VIRT(virtual memory usage)虚拟内存,是进程正在使用的所有内存(ps中标为VSZ)
RES(resident memory usage)进程所使用的物理内存。实际实用内存(ps中标为RSS)
SHR共享内存大小,单位kb
S进程状态
%CPU上次更新到现在的CPU时间占用百分比
%MEM进程使用的物理内存百分比
TIME+进程使用的CPU时间总计,单位1/100秒
COMMAND命令名/命令行

VIRT:virtual memory usage 虚拟内存

  1. 进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等
  2. 假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量

RES:resident memory usage 常驻内存

  1. 进程当前使用的内存大小,但不包括swap out
  2. 包含其他进程的共享
  3. 如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反
  4. 关于库占用内存的情况,它只统计加载的库文件所占内存大小

SHR:shared memory 共享内存

  1. 除M了自身进程的共享内存,也包括其他进程的共享内存
  2. 虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小
  3. 计算某个进程所占的物理内存大小公式:RES – SHR
  4. swap out后,它将会降下来

S 进程状态。

  • D=不可中断的睡眠状态
  • R=运行中或可运行
  • S=睡眠中
  • T=已跟踪/已停止
  • Z=僵停

top快捷键:

  • 默认3s刷新一次,按s修改刷新时间
  • 按空格:立即刷新
  • q退出
  • P:按CPU排序
  • M:按内存排序
  • T按时间排序
  • p: 进程IP,查看某个进程状态
  • 数字键1:显示每个内核的CPU使用率
  • u/U:指定显示的用户
  • h:帮助

找到进程ID

[root@localhost ~]# ps -axu | grep vim
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 9667 0.0 0.2 143620 3344 pts/1 S<+ 19:15 0:00 vim a.txt
[root@localhost ~]# top -p 9667

lsof命令

lsof命令用于查看你进程打开的文件,打开文件的进程,进程打开的端口(TCP、UDP)

常用参数:

  • -i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip )
  • -p<进程号>:列出指定进程号所打开的文件;

例:

[root@love ~]# vim a.txt
[root@love ~]# ps -axu | grep a.txt
root 43641 0.8 0.2 151744 5280 pts/3 S+ 18:19 0:00 vim a.txt
root 43652 0.0 0.0 112676 996 pts/1 S+ 18:19 0:00 grep --color=auto a.txt
[root@love ~]# lsof -p 43641 # 一般用于查看木马进程,在读哪些文件
[root@love ~]# lsof -i :22 # 用于查看端口,或查看黑客开启的后门端口是哪个进程在使用

pstree工具使用

pstree:(display a tree of processes)以树状图显示进程,只显示进程的名字,且相同进程合并显示。

格式:pstree 或 pstree -p 以树状图显示进程,还显示进程PID。

[root@love ~]# pstree -p

前后台进程切换 nice进程优先级

Linux后台进程与前台进程的区别

前台进程:是在终端中运行的命令,那么该终端就为进程的控制终端,一旦这个终端关闭,这个进程也随着消失。
后台进程:也叫守护进程(Daemon),是运行在后台的一种特殊进程,不受终端控制,它不需要与终端交互;Linux的大多数服务器就是用守护进程实现的。比如,Web服务器httpd等。

进程的前台与后台运行跟系统任务相关的几个命令(了解):

&用在一个命令的最后,可以把这个命令放到后台执行.
ctrl + z将一个正在前台执行的命令放到后台,并且暂停.
jobs查看当前有多少在后台运行的进程.它是一个作业控制命令
fg(foreground process)将后台中的命令调至前台继续运行, 如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
bg(background process)将一个在后台暂停的命令,变成继续执行; 如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)

恢复被挂起的进程

[root@love ~]# vim a.txt # 打开后,然后执行 ctrl+z
[1]+ 已停止 vim a.txt
[root@love ~]# ps -axu | grep vim
root 43710 0.8 0.2 151744 5304 pts/3 T 18:26 0:00 vim a.txt
root 43720 0.0 0.0 112676 984 pts/3 S+ 18:26 0:00 grep --color=auto vim
[root@love ~]# jobs # 查看当前有多少在后台运行的进程
[1]+ 已停止 vim a.txt
[root@love ~]# fg 1 # 将后台挂起的进程恢复到前台运行

kill关闭进程

关闭进程3个命令:kill killall pkill

  • kill关闭进程:kill 进程号 关闭单个进程
  • killall和pkill 命令用于杀死指定名字的进程
  • 通过信号的方式来控制进程的
kill -l 列出所有支持的信号(了解) 用最多的是: 9 信号
信号编号信号名
1 SIGHUP重新加载配置
2 SIGINT键盘中断 crtl+c
3 SIGQUIT退出
9 SIGKILL强制终止
15 SIGTERM终止(正常结束),缺省信号
18 SIGCONT继续
19 SIGSTOP停止
20 SIGTSTP暂停 crtl+z

进程的优先级管理

优先级取值范围为(-20,19),越小优先级越高, 默认优先级是0

nice 指定程序的运行优先级格式:nice n command
renice 改变程序的运行优先级格式:renice -n pid

声明:Rock 版权所有,内容均为原创,欢迎转载。

转载:转载请注明原文链接 - 进程


我是一个程序员,致力于网页开发,我还很年轻,什么也不懂。