1、程序和进程

1.1 进程是已启动的可执行程序的运行中的实例

1.1.1 进程组成部分

  • 已分配内存的地址空间
  • 程序代码的一个或多个执行线程
  • 以及进程状态

1.1.2 进程的环境包括

  • 本地和全局变量
  • 分配的系统资源,如文件描述符和网络端口

1.2 进程生命周期

通过fork,子进程继承父进程安全性身份、过去和当前的文件描述符、端口、资源特权、环境变量,以及程序代码。随后子进程可能exec其自己的程序代码。通常,父进程在子进程运行期间处于睡眠状态,设置一个在子进程完成时发出信号的请求。在退出时,子进程可能关闭或丢弃了其资源和环境,剩余部分为僵停。父进程在子进程退出时收到信号而被唤醒,清理剩余的结构,然后继续执行其自己的程序代码。

1.3 进程的状态

  • S:休眠状态(sleeping)
  • R:等待运行(runable)R Running or runnable (on run queue) 进程处于运行或就绪状态
  • Z:僵尸状态(zombie)   
  • T:跟踪状态或暂停状态(Traced)
  • D:不可中断的深度睡眠,一般由IO引起,同步IO在做读或写操作时,cpu不能做其它事情,只能等待,这时进程处于这种状态,如果程序采用异步IO,这种状态应该就很少见到了

1.4 进程状态转换图


image.png

备注:schedule为调度器

1.5 程序和进程区别

程序是为了完成某种任务而设计的软件,比如Office是程序。什么是进程呢?进程就是运行中的程序。

1.6 进程分类

进程一般分为交互进程、批处理进程和守护进程三类:

  • 守护进程:守护进程是一直运行的一种进程,经常在linux系统启动时启动,在系统关闭时终止
  • 交互进程:由一个shell终端启动的进程,在执行过程中,需要与用户进行交互操作,可以运行于前台,也可以运行在后台。
  • 批处理进程:该进程是一个进程集合,负责按顺序启动其他的进程。

1.6.1 守护进程

值得一提的是守护进程总是活跃的,一般是后台运行,守护进程一般是由系统在开机时通过脚本自动 激活启动或超级管理用户root来启动。比如在Fedora或Redhat中,我们可以定义httpd 服务器的启动脚本的运行级别,此文件位于/etc/init.d目录下,文件名是httpd,/etc/init.d/httpd 就是httpd服务器的守护程序,当把它的运行级别设置为3和5时,当系统启动时,它会跟着启动。
由于守护进程是一直运行着的,所以它所处的状态是等待请求处理任务。
相关命令:systemctl enable

1.7 进程的属性;

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

2 进程相关命令

2.1 父进程和子进程

命令查看:pstree -p
他们的关系是管理和被管理的关系,当父进程终止时,子进程也随之而终止。但子进程终止,父进程并不一定终止。比如httpd服务器运行时,我们可以杀掉其子进程,父进程并不会因为子进程的终止而终止。
在进程管理中,当我们发现占用资源过多,或无法控制的进程时,应该杀死它,以保护系统的稳定安全运行;

2.1.1 进程管理

对于Linux进程的管理,是通过进程管理工具实现的,比如ps、kill、pgrep等工具;

2.2 ps 命令介绍

2.2.1 ps 监视进程工具

ps 为我们提供了进程的一次性的查看,它所提供的查看结果并不动态连续的;如果想对进程时间监控,应该用top工具;

ps 的参数说明
ps 提供了很多的选项参数,常用的有以下几个;

  • l 长格式输出;
  • u 按用户名和启动时间的顺序来显示进程;
  • j 用任务格式来显示进程;
  • f 用树形格式来显示进程;
  • a 显示所有用户的所有进程(包括其它用户);
  • x 显示无控制终端的进程;
  • r 显示运行中的进程;
  • A 显示所有进程
  • e 显示所有进程

2.2.2 ps aux 详解

image.png

  1. USER 进程的属主;
  2. PID 进程的ID
  3. PPID 父进程;
  4. %CPU 进程占用的CPU百分比;
  5. %MEM 占用内存的百分比;
  6. VSZ 进程虚拟大小;
  7. RSS 驻留中页的数量,Kb,实际看的
  8. TTY 终端ID
  9. STAT 进程状态
  10. START 启动时间
  11. TIME 进程占用CPU时间
  12. COMMAND 运行命令

2.2.3 ps -ef 详解

image.png

UID    用户ID、但输出的是用户名
PID    进程的ID
PPID   父进程ID
C      进程占用CPU的百分比
STIME  进程启动到现在的时间   %%%%
TTY       该进程在那个终端上运行,若与终端无关,则显示?
若为pts/0等,则表示由网络连接主机进程。
TIME    进程占用CPU时间
CMD    命令的名称和参数

2.2.4 ps -e -o pid,ppid,stat,command 指定查看

image.png

2.3 lsof命令

lsof监视工具
lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

lsof输出各列信息的意义如下:
COMMAND:进程的名称 
PID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等 
TYPE:文件类型,如DIR、REG等
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称

lsof abc.txt 显示开启文件abc.txt的进程
lsof -c abc 显示abc进程现在打开的文件
lsof  -p 1234 列出进程号为1234的进程所打开的文件
lsof +d 1  显示标准输出的进程名
lsof -i 用以显示符合条件的进程情况  常用于查看端口被哪些进程占用

2.4 top命令

2.4.1 命令格式

top [参数]

2.4.2 命令功能

显示当前系统正在执行的进程的相关信息,包括进程ID、内存占用率、CPU占用率等

2.4.3 命令参数

-c 显示完整的治命令
-u<用户名> 指定用户名
-p<进程号> 指定进程
-n<次数> 循环显示的次数

2.4.4 使用实例

image.png
**

前五行是当前系统情况整体的统计信息区。下面我们看每一行信息的具体意义。
第一行,任务队列信息,同 uptime 命令的执行结果,具体参数说明情况如下:
13:26:51 — 当前系统时间
up 70 days, 16:44 — 系统已经运行了70天16小时44分钟(在这期间系统没有重启过的吆!)
2 users — 当前有2个用户登录系统
load average: 1.15, 1.42, 1.44 — load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。
load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。

第二行,Tasks — 任务(进程),具体信息说明如下:
系统现在共有206个进程,其中处于运行中的有1个,205个在休眠(sleep),stoped状态的有0个,zombie状态(僵尸)的有0个。

第三行,cpu状态信息,具体属性说明如下:
5.9%us — 用户空间占用CPU的百分比。
3.4% sy — 内核空间占用CPU的百分比。
0.0% ni — 改变过优先级的进程占用CPU的百分比
90.4% id — 空闲CPU百分比
0.0% wa — IO等待占用CPU的百分比
0.0% hi — 硬中断(Hardware IRQ)占用CPU的百分比
0.2% si — 软中断(Software Interrupts)占用CPU的百分比

第四行,内存状态,具体信息如下:
32949016k total — 物理内存总量(32GB)
14411180k used — 使用中的内存总量(14GB)
18537836k free — 空闲内存总量(18GB)
169884k buffers — 缓存的内存量 (169M)

第五行,swap交换分区信息,具体信息说明如下:
32764556k total — 交换区总量(32GB)
0k used — 使用的交换区总量(0K)
32764556k free — 空闲交换区总量(32GB)
3612636k cached — 缓冲的交换区总量(3.6GB)

第六行,空行。

第七行以下:各进程(任务)的状态监控,项目列信息说明如下:
PID — 进程id
USER — 进程所有者
PR — 进程优先级
NI — nice值。负值表示高优先级,正值表示低优先级
VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR — 共享内存大小,单位kb
S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU — 上次更新到现在的CPU时间占用百分比
%MEM — 进程使用的物理内存百分比
TIME+ — 进程使用的CPU时间总计,单位1/100秒
COMMAND — 进程名称(命令名/命令行)

2.5 杀死进程kill、killall、pkill

下面是常用的信号:
HUP    1    终端断线,重启进程
TERM   15    终止 (默认)
KILL    9    强制终止
只有第9种信号(SIGKILL)才可以无条件终止进程

2.5.1 killall

killall 通过程序的名字,直接杀死所有进程
用法:killall 正在运行的程序名
image.png

2.5.2 pkill

pkill 和killall 应用方法差不多,也是直接杀死运行中的程序;如果您想杀掉单个进程,请用kill 来杀掉。
应用方法:
#pkill 正在运行的程序名
image.png

2.5.3 bg 和fg、jobs、nohup

ctrl + z:后台运行
ctrl + c:终止运行
fg:将后台中的命令调至前台继续运行
bg:将一个在后台暂停的命令,变成继续执行
nohup:不间断的运行,如:nohup ./b.sh > /tmp/1.txt &