在正式的工作环境中,作为 Linux 系统管理员,监视系统过程的运行状况应该是日常的工作之一。那么,到底什么是过程呢?
什么是过程
过程是正在执行的一个程序或命令,每个过程都是一个运行的实体,都有本人的地址空间,并占用肯定的系统资源,它由程序指令,和从文件、其它程序中读取的数据或零碎用户的输出组成。操作系统会给过程调配一个 ID,称为 PID(过程 ID)。
过程的类型
- 前台过程:这些过程由终端会话初始化和管制。换句话说,须要有一个连贯到零碎中的用户来启动这样的过程;它们不是作为零碎性能 / 服务的一部分主动启动
- 后盾过程:这些过程没有连贯到终端;它们不须要任何用户输出
- 守护过程:这是后盾过程的非凡类型,它们在系统启动时启动,并作为服务始终运行
在操作系统中,所有能够执行的程序与命令都会产生过程。只是有些程序和命令非常简单,如 ls 命令等,它们在执行完后就会完结,相应的过程也就会终结,所以咱们很难捕捉到这些过程。然而还有一些程和命令,比方 httpd 过程,启动之后就会始终驻留在零碎当中,咱们把这样的过程称作常驻 内存过程
。
某些过程会产生一些新的过程,咱们把这些过程称作子过程,而把这个过程自身称作父过程。比方,咱们必须失常登录到 Shell 环境中能力执行系统命令,而 Linux 的规范 Shell 是 bash。咱们在 bash 当中执行了 ls 命令,那么 bash 就是父过程,而 ls 命令是在 bash 过程中产生的过程,所以 ls 过程是 bash 过程的子过程。也就是说,子过程是依赖父过程而产生的,如果父过程不存在,那么子过程也不存在了。
查看零碎中所有的过程: ps aux
ps 命令用于查看零碎中的过程状态,格局为“ps [参数]”。
- 查看零碎中所有的过程
$ ps aux
参数 | 作用 |
---|---|
-a | 显示所有过程(包含其余用户的过程) |
-u | 用户以及其余详细信息 |
-x | 显示没有管制终端的过程 |
如上图,咱们来看看以上输入信息中各列的具体含意:
列名 | 含意 |
---|---|
USER | 该过程是由哪个用户产生的 |
PID | 过程的 ID |
%CPU | 该过程占用 CPU 资源的百分比,占用的百分比越高,过程越消耗资源 |
%MEM | 该过程占用物理内存的百分比,占用的百分比越高,过程越消耗资源 |
VSZ | 该过程占用虚拟内存的大小,单位为 KB |
RSS | 该过程占用理论物理内存的大小,单位为 KB |
TTY | 该过程是在哪个终端运行的。 |
STAT | 过程状态。 |
START | 该过程的启动工夫。 |
TIME | 该过程占用 CPU 的运算工夫,留神不是零碎工夫。 |
COMMAND | 产生此过程的命令名。 |
常见的 STAT 过程状态有以下几种:
- D:不可被唤醒的睡眠状态,通常用于 I/O 状况
- R:该过程正在运行
- S:该过程处于睡眠状态,可被唤醒
- T:进行状态,可能是在后盾暂停或过程处于除错状态
- W:内存交互状态(从 2.6 内核开始有效)
- X:死掉的过程(应该不会呈现)
- Z:僵尸过程。过程曾经停止,然而局部程序还在内存当中
- <:高优先级(以下状态在 BSD 格局中呈现)
- N:低优先级
- L:被锁入内存
- s:蕴含子过程
- l:多线程(小写 L)
- +:位于后盾
查看零碎中所有的过程 ps -le
ps -le
能够查看零碎中所有的过程,而且还能看到过程的父过程的 PID 和过程优先级。
参数 | 作用 |
---|---|
-l | 长格局显示更加具体的信息; |
-e | 显示所有过程; |
如上图,咱们来看看以上输入信息中各列的具体含意:
列名 | 含意 |
---|---|
F | 过程标记,阐明过程的权限,常见的标记有两个:1 过程能够被复制,然而不能被执行;4:过程应用超级用户权限; |
S | 过程状态。具体的状态和 ps aux 命令中的 STAT 状态统一; |
UID | 运行此过程的用户的 ID; |
PID | 过程的 ID; |
PPID | 父过程的 ID; |
C | 该过程的 CPU 使用率,单位是百分比; |
PRI | 过程的优先级,数值越小,该过程的优先级越高,越早被 CPU 执行; |
NI | 过程的优先级,数值越小,该过程越早被执行; |
ADDR | 该过程在内存的哪个地位; |
SZ | 该过程占用多大内存; |
WCHAN | 该过程是否运行。”-“ 代表正在运行; |
TTY | 该过程由哪个终端产生; |
TIME | 该过程占用 CPU 的运算工夫,留神不是零碎工夫; |
CMD | 产生此过程的命令名; |
删除过程 kill
kill 可将指定的信息送至程序,默认的信息为 SIGTERM(15),可将指定程序终止。若仍无奈终止该程序,可应用 SIGKILL(9)信息尝试强制删除程序。kill 命令格局如下:
$ kill [信号] PID
信号编号 | 信号名 | 含意 |
---|---|---|
0 | EXIT | 程序退出时收到该信息。 |
1 | HUP | 挂掉电话线或终端连贯的挂起信号,这个信号也会造成某些过程在没有终止的状况下从新初始化。 |
2 | INT | 示意完结过程,但并不是强制性的, 相当于用键盘输入 [ctrl]-c 来中断一个程序的进行 |
3 | QUIT | 退出 |
9 | KILL | 杀死过程,即强制完结过程 |
15 | TERM | 失常完结过程, 命令的默认信号 |
19 | SIGSTOP | 相当于用键盘输入 [ctrl]-z 来暂停一个程序的进行 |
咱们用的最多的信号编号是 1,9,15。
最初咱们来看看所谓的“僵尸过程”,僵尸过程是当子过程比父过程先完结,而父过程又没有回收子过程,开释子过程占用的资源,此时子过程将成为一个僵尸过程。僵尸过程会对主机的稳定性产生影响,所以,在产生僵尸过程后,肯定要对产生僵尸过程的软件进行优化,防止始终产生僵尸过程;对于曾经产生的僵尸过程,能够在查找进去之后强制停止。