文章目录
本文是循序渐进学运维-基础篇系列的第44篇文章
本文我们主要来探讨Linux下的进程,如果对你有帮助欢迎点赞收藏。
Linux进程
1. 进程的概念
Linux当中有很多用户,每个用户都可以同时运行多个程序,靠程序名来记忆每个程序,显然不是一个好办法。 Linux当中为了区分每一个运行的程序,给没给进程做了一个标识,这个标识我们叫他进程号(process ID) ,就像一个ip地址一样,通过进程号来辨别每个进程。
操作系统给每个用户赋予了权限,用户可以控制自己的进程,比如分配不同的优先级,终止和启动进程等。
进程一般由四个部分组成:
- 已分配的内存地址空间
- 安全属性,包括所有权凭据和特权
- 程序代码的一个或者多个执行进程
- 进程的状态
进程的状态一般有三种:
- 就绪状态
- 执行状态
- 阻塞状态
三种状态的转换如图:
简单了解了进程之后,我们来看看进程的属性:
2. 进程的属性
进程ID(PID) : 这是用来区分进程的唯一标识
父进程的ID : PPID
进程的状态: 运行(R),休眠(s)和僵尸(z)
centos6 系统启动后的第一个进程是init, PID 是1.
centos7 PID 为1的进程是systemd
3. 关于僵尸进程
僵尸进程: 一个进程使用fork创建子进程后,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述仍然保存在系统中。这种进程就是僵尸进程。
任何一个子进程(init除外) 在exit() 之后,并非马上消失,而是留下一个称之为僵尸进程的数据结构,等待父进程处理。如果这时候父进程没有来的及处理,我们用ps命令就会看到大写的Z的进程。 如果子进程结束前,父进程已经退出,这时候的子进程由init接管。 init会以父进程的身份对僵尸进程进行处理。
Linux管理的基本命令
1. ps命令
1) 常用参数:
选项 | 作用 |
---|---|
a | 显示现行终端机下的所有进程,包括其他用户的进程; |
u | 显示进程拥有者、状态、资源占用等的详细信息(注意有“-”和无“-”的区别); |
x | 显示没有控制终端的进程。通常与 a 这个参数一起使用,可列出较完整信息; |
e | 显示所有进程; |
f | 完整输出显示进程之间的父子关系; |
l | 较长、较详细的将该 PID 的的信息列出; |
o | 自定义显示的字段; |
2)常用组合
a) ps -aux
注: 最后一列[xxxx] 使用方括号括起来的进程是内核态的进程。 没有括起来的是用户态进程
b) ps-uax输出的各个参数的含义如图:
参数 | 含义 |
---|---|
USER: | 启动这些进程的用户 |
PID | 进程的ID |
%CPU | 进程占用的CPU百分比; |
%MEM | 占用内存的百分比; |
VSZ | 进程占用的虚拟内存大小(单位:KB) |
RSS | 进程占用的物理内存大小(单位:KB) |
STAT | 该程序目前的状态 |
START | 该 process 被触发启动的时间; |
TIME | process 实际使用 CPU 运作的时间。 |
COMMAND | 该程序的实际指令 |
c) Linux进程有5种基本状态:
R |该程序目前正在运作,或者是可被运作; S |该程序目前正在睡眠当中 (可说是 idle 状态啦!),但可被某些讯号(signal) 唤醒。 T |该程序目前正在侦测或者是停止了; Z |该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态 D |不可中断状态.
除了这5中状态外还有一些延伸的状态:
可以看到在S后面还有个小s, 或者有< 这类的拓展状态 ,这些标记表示:
符号 | 含义 |
---|---|
< | 表示进程运行在高优先级上 |
N: | 表示进程运行在低优先级上 |
L: | 表示进程有页面锁定在内存中 |
s | 表示进程是控制进程 |
l: | 表示进程是多线程的 |
+: | 表示当前进程运行在前台 |
3) 举例
a) 进程状态查看
打开一个进程:
在另一个终端查看:
注: 此处显示的是S,睡眠状态,+表示在前台。 意思是 在前台睡眠状态。如果我们把他调到后台运行会怎么样呢?
查询结果为T: T表示出于停止状态
b) ps的使用方法 -ef
ps -ef
-e 显示所有进程
-f 显示完整格式输出
此处包含的信息和ps -aux 不同,我们来看一下具体的含义:
参数 | 含义 |
---|---|
UID | 启动这些进程的用户 |
PID | 进程的ID |
PPID | 父进程的进程号 |
C | 进程生命周期中的CPU利用率 |
STIME: | 进程启动时的系统时间 |
TTY | 表明进程在哪个终端设备上运行。如果显示 ?表示与终端无关,这种进程一般是内核态进程。另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等,则表示运行在虚拟终端上的进程。 |
TIME: | 运行进程一共累计占用的CPU时间 |
CMD: | 启动的程序名称 |
c) 根据cpu/内存来升序排序
[root@zmgaosh log]# ps -aux --sort pcpu |less
[root@zmgaosh log]# ps -aux --sort pmem |less
补充:
使用PS实时监控进程状态
[root@zmgaosh log]# watch -n 1 ‘ps -aux --sort -pmem,-pcpu’
总结:
ps uax 和ps -ef 两者的输出结果差别不大,只是展示结果不同
aux是BSD风格, -ef是System风格, 更重要的是aux会截断command列。
我是高胜寒,一个在教培行业不忘初心的人, 关注我,一起学习,欢迎点赞收藏,我们下篇文章再见!