Linux进程管理
程序与进程
程序(program是一个普通文件,是为了完成特定任务而准备好的指令序列与数 据的集合,这些指令和数据以“可执行映像”的格式保存在磁盘中。
进程(process是一个已经开始执行但还没终止的程序实例。Linux系统下使用ps 命令可以查看到当前正在执行的进程。每个进程包含有进程运行环境、内存地址空 间、进程ID、和至少一个被称为线程的执行控制流等资源。同一个程序可以实例化为 多个进程实体。
进程和程序的区别
- 程序是静态的,它只是一组指令的集合,不具有任何的运行意义。而进程是程序运行的动态过程。
- 进程和程序并不是一一对应的关系,相同的程序运行在不同的数据集上就是不同的进程。
- 进程还具有并发性和交往行,而程序确实封闭的。
进程和线程
进程是程序的一次动态执行,它对应着从代码加载、执行至执行完毕的一个完整的过 程,是一个动态实体,它有自己的声明周期。进程因创建而产生,因调度而运行,因 等待资源或事件而被处于等待状态,因完成任务而被撤销。
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运 行的基本单位。一个线程可以创建和撤销另一个线程,同一个进程的多个线程之间可 以并发执行。
###进程与线程的关系
- 一个进程可以拥有多个线程,而一个线程同时只能被一个进程所拥有。
- 线程不能单独执行,但是每一个线程都有程序的入口、执行序列以及程序出口,他必须组成进程才能被执行。
父子进程
子进程是有一个进程所产生的进程,产生这个进程的进程称为父进程,在Linux系统中,使用系统调用fork创建进程。新创建的子进程几乎但不完全与父进程相同。子进程得到与父进程用户级虚拟地址相同的(但是独立的)一份副本,包括代码和数据段、堆、共享库以及用户栈。
进程状态
Linux是一个多用户多任务的操作系统,可以同时运行多个用户的多个程序,就必 然会产生多进程,而每个进程会有不同的状态。Linux的进程有以下几种状态:
R(运行):进程正在运行或在运行行列中等待。
S(终端):进程处于休眠中,当某个条件形成后或者接收到信号后,则脱离该状态。
D(不可中断):进程不响应系统异步信号,及使用kill命令也杀不死,
Z(僵死):进程已经终止,但进程描述符依然存在。
T(停止):进程收到停止信号后停止运行。
进程的优先级
Linux是一个多用户多任务的操作系统。所有的任务都放在一个队列中,操作系统根 据每个任务的优先级为每个任务分配合适的时间片(时间片是进程在处理器中执行时 间)。
在CPU执行每个任务的过程中,进程优先级决定了进程在CPU中的执行顺序。优先级 越高的进程被处理器执行的的机会越大。
进程优先级由动态优先级和静态优先级决定,根据进程的行为,内核使用启发式算法 决定开启或关闭动态优先级。可以通过nice级别直接修改进程的静态优先级,拥有越 高的静态优先级的进程会获得更长的时间片。
Linux支持的nice级别从19(最低优先 级)到-20(最高优先级),默认为0。只有root用户才能把进程的nice级别调整为 负数(让其具备较高优先级)。
守护进程
在某些用户空间中,即使用户退出登录,仍然会有一些后台进程在运行,这些进程被 称为守护进程。
守护进程有三个最基本的特点:后台运行,独立于终端,完成一定的任务。
首先所谓的后台运行过程是一般是在图形界面或是终端不可见的;而独立于终端是说 它不和终端联系,运行之后一般不接受终端的输入也不向终端输出;而完成一点的任 务是每一个守护进程的运行都是为了完成一定的任务而运行的,这些任务一般都是系 统相关的任务。
Linux进程管理工具
pstree命令
用于查看进程树之间的关系,可以看到父子进程的关系
-A:各进程树之间的连接以ASCII码字符来连接。
-U:各进程树之间的连接以utf8字符来连接,某些终端可能会有错误
-p:同时列出各个进程的PID
-u:同时列出各个进程的所属账号名称。
ps命令
-A:所有的进程均显示出来,与-e具有同样效果
-a :显示现行终端机下的所有进程,包括其他用户的进程
-u:以用户为主的进程状态
-x:通常与a一起使用,可列出较完整信息
-l:较长较详细的将该pid的信息列出
-f:做一个更完整的输出
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 193808 5840 ? Ss 02:08 0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
USER:该进程属于哪个使用者账号。
PID:该进程的进程ID号。
%CPU:该进程所占用CPU百分比。
%MEM:该进程所占用的物理内存百分比。
VSZ :该进程使用掉的虚拟内存量。
RSS:该进程占用的固定的内存量。
TTY:该进程是在哪个终端机上面运作,若与终端机无关,则显示?。另外,tty1-tty6是本机上面的登入者程序,若为pts/0等等,贼表示为由网络连接进主机的程序。
==STAT:==该程序目前的状态,主要的状态有:
R(运行):进程正在运行或在运行行列中等待。
S(终端):进程处于休眠中,当某个条件形成后或者接收到信号后,则脱离该状态。
D(不可中断):进程不响应系统异步信号,及使用kill命令也杀不死,
Z(僵死):进程已经终止,但进程描述符依然存在。
T(停止):进程收到停止信号后停止运行。
START:该进程被触发启动的时间。
TIME:该进程实际使用CPU运作的时间。
COMMAND:该进程的实际指令。
pgrep命令
经常要查看进程的信息,包括进程是否已经消亡,通过pgrep来获得正在被调度的进程的相关信息。pgrep通过匹配其程序名,找到匹配的进程。
-l:同时显示进程名及pid
-o:当匹配进程时,显示进程号最小的那个
-n:当匹配进程时,显示进程号最大的那个
killall命令
killall命令用于杀死指定名字的进程。(可以直接全部杀死)
-e:要求匹配进程名称
pkill命令
pkill 进程名称 :终止进程
kill命令
kill命令用来终止指定的进程的运行,kill命令是通过向进程发送指定的信号来结束相应的进程。默认情况下,采用编号为15的TERM信号。TERM信号将终止所有不能捕获该信号的进程。对于那些可以捕获该信号的进程需要用编号为9的kill信号,强行终止该进程。
kill [选项] [进程ID]
-l:列出全部的信号名称
-a;当处理当前进程时,不限制命令名和进程号的对应关系
-p:指定kill命令只打印相关进程的进程号,而不发送任何信号
-s:指定发送信号
-u:指定用户
kill -0 进程 ID :可以判断进程是否存在,如果存在,可以通过 $?拿到值为 0,否则值为 1
top命令
动态查看进程
op命令执行结果的前5行为系统整体的统计信息,其代表含义如下:
第一行:系统时间、运行时间、登陆终端数、系统负载(3个数值分别为1分钟、5分钟、15分钟内的平均值,数值越小意味着负载越低)。
第二行:进程总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数。
第三行:用户占用资源百分比、系统内核占用资源百分比、改变过优先级的进程资源百分比、空闲的资源百分比等。其中数据均为CPU数据并以百分比格式显示,“100.0 id”意味着由有100%的CPU处理器资源处于空闲。
第四行:物理内存总量、内存空闲量、内存使用量、作为内核缓存的内存量。
第五行:虚拟内存总量、虚拟内存空闲量、虚拟内存使用量、已被提前加载的内存量。
PID:进程id。
USER:进程所有者。
RP:进程优先级。
NI:nice值,负值表示高级优先,正值表示低级优先。
VIPI:进程使用的虚拟内存总量,单位kb。
RES:进程使用的、未被换出的物理内存大小,单位kb。
SHR:共享内存大小,单位kb。
S:进程状态。
%CPU:上次更新到现在的CPU时间占用百分比。
%MEM:进程使用的物理内存百分比。
TIME+:进程使用的CPU时间总计,单位1/100秒。
COMMAND:进程名称(命令名/命令行)。
top常用选项:
- -d 秒数 ,指定经过多长时间更新
- -i 不显示任何闲置或者僵死进程。
- -p 通过指定监控进程id来仅仅监控某个进程的状态
交互操作:
在查看动态进程信息时,输入以下内容:
- P 以CPU使用率排序,默认下是此项。
- M 以内存的使用率排序。
- N 以PID排序。
- q 退出top
- u 然后输入用户名,就可以查看该用户下的进程。
- k 然后输入要结束的进程pid,(然后输入9就会强制结束 )就可以结束该进程。
htop命令
也是实时监控进程动态界面,如下:
上左区域:显示了CPU、物理内存、和交换分区的信息;
上右区域:显示了任务数量、平均负载和连接运行时间等信息;
进程区域:显示当前系统的所有进程
PID:进程id。
USER:进程所有者。
RP:进程优先级。
NI:nice值,负值表示高级优先,正值表示低级优先。
VIPI:进程使用的虚拟内存总量,单位kb。
RES:进程使用的、未被换出的物理内存大小,单位kb。
SHR:共享内存大小,单位kb。
S:进程状态。
%CPU:上次更新到现在的CPU时间占用百分比。
%MEM:进程使用的物理内存百分比。
TIME+:进程使用的CPU时间总计,单位1/100秒。
COMMAND:进程名称(命令名/命令行)
F1:显示帮助信息;F2:配置界面的显示信息;F3:搜索进程;F4:过滤器;F5:以树形方式显示;F6:排序方法 ;F7,F8:调整进程nice值;F9:杀死进程;F10:退出htop
vmstat命令
常见的监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况。
[root@Qi2 ~]# vmstat 2 3 # 2代表2秒采集一次,3表示采集三次
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 7944 68128 36 1105052 0 0 7 7 24 30 0 0 100 0 0
0 0 7944 68104 36 1105052 0 0 0 0 54 77 0 0 100 0 0
0 1 7944 68104 36 1105052 0 0 0 0 47 72 0 0 100 0 0
字段含义:
Process:
- r:等待执行的任务数
- B:等待IO的进程数量
Memory:
- swpd:正在使用虚拟的内存大小,单位k
- free:空闲的内存大小
- buff:已用的buff大小,对块设备的读写进行缓冲
- cache:已用的cache大小,文件系统的cache
- nact:非活跃内存的大小
- active:活跃的内存大小
Swap:
- si:每秒从交换区写入内存的大小
- so:每秒从内存写到交换区的大小
IO:
- bi:每秒读取的块数
- bo:每秒写入的块数
System:
- in:每秒中断数,包括时钟中断
- cs:每秒上下文切换数
CPU;
- Us:用户进程执行消耗cpu的时间
- Sy:系统进程消耗cpu的时间
- id:空闲时间(包括IO等待时间)
- wa:等待IO时间
lsof命令
lsof是一个列出当前系统打开文件的工具。
[root@Qi2 ~]# lsof | head -n 3
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 8,3 224 64 /
systemd 1 root rtd DIR 8,3 224 64 /
COMMAND:进程名称
PID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件
TYPE:文件类型
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点
NAME:打开文件的确切名称
语法 lsof [options] filename
-p:列出某个进程号所打开的文件
+d:显示目录下被进程打开的文件
-c:显示以什么开头的进程所打开的文件
-d:显示使用某个fd的进程
-i:显示符合条件的进程情况(lsof -i :port 过滤端口占用的进程)