文章目录
1. ps命令简介
-
Linux 中的 ps 命令是 Process Status 的缩写。ps 命令用来列出系统中 当前正在运行 的那些进程,就是执行 ps 命令的那个时刻的那些进程的快照。使用该命令可以确定有哪些进程 正在运行 和 运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。总之大部分信息都是可以通过执行该命令得到的。
-
ps 查看的结果不是动态连续的,如果想要动态的显示进程信息,就可以使用 top、htop 命令。
-
ps命令用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序。
-
ps所有内容均可在以下网址查询:
https://www.man7.org/linux/man-pages/man1/ps.1.html
2. ps命令参数
选项 | 描述 |
---|---|
-a | 显示所有终端机下执行的程序,除了阶段作业领导者之外。 |
a | 显示现行终端机下的所有程序,包括其他用户的程序。 |
-A | 显示所有程序。 |
-c | 显示CLS和PRI栏位。 |
c | 列出程序时,显示每个程序真正的指令名称,而不包含路径,选项或常驻服务的标示。 |
-C<指令名称> | 指定执行指令的名称,并列出该指令的程序的状况。 |
-d | 显示所有程序,但不包括阶段作业领导者的程序。 |
-e | 此选项的效果和指定"A"选项相同。 |
e | 列出程序时,显示每个程序所使用的环境变量。 |
-f | 显示UID,PPIP,C与STIME栏位。 |
f | 用ASCII字符显示树状结构,表达程序间的相互关系。 |
-g<群组名称> | 此选项的效果和指定"-G"选项相同,当亦能使用阶段作业领导者的名称来指定。 |
g | 显示现行终端机下的所有程序,包括群组领导者的程序。 |
-G<群组识别码> | 列出属于该群组的程序的状况,也可使用群组名称来指定。 |
h | 不显示标题列。 |
-H | 显示树状结构,表示程序间的相互关系。 |
-j或j | 采用工作控制的格式显示程序状况。 |
-l或l | 采用详细的格式来显示程序状况。 |
L | 列出栏位的相关信息。 |
-m或m | 显示所有的执行绪。 |
n | 以数字来表示USER和WCHAN栏位。 |
-N | 显示所有的程序,除了执行ps指令终端机下的程序之外。 |
-p<程序识别码> | 指定程序识别码,并列出该程序的状况。 |
p<程序识别码> | 此选项的效果和指定"-p"选项相同,只在列表格式方面稍有差异。 |
r | 只列出现行终端机正在执行中的程序。 |
-s<阶段作业> | 指定阶段作业的程序识别码,并列出隶属该阶段作业的程序的状况。 |
s | 采用程序信号的格式显示程序状况。 |
S | 列出程序时,包括已中断的子程序资料。 |
-t<终端机编号> | 指定终端机编号,并列出属于该终端机的程序的状况。 |
t<终端机编号> | 此选项的效果和指定"-t"选项相同,只在列表格式方面稍有差异。 |
-T | 显示现行终端机下的所有程序。 |
-u<用户识别码> | 此选项的效果和指定"-U"选项相同。 |
u | 以用户为主的格式来显示程序状况。 |
-U<用户识别码> | 列出属于该用户的程序的状况,也可使用用户名称来指定。 |
U<用户名称> | 列出属于该用户的程序的状况。 |
v | 采用虚拟内存的格式显示程序状况。 |
-V或V | 显示版本信息。 |
-w或w | 采用宽阔的格式来显示程序状况。 |
x | 显示所有程序,不以终端机来区分。 |
X | 采用旧式的Linux i386登陆格式显示程序状况。 |
-y | 配合选项"-l"使用时,不显示F(flag)栏位,并以RSS栏位取代ADDR栏位 。 |
-<程序识别码> | 此选项的效果和指定"p"选项相同。 |
–cols<每列字符数> | 设置每列的最大字符数。 |
–columns<每列字符数> | 此选项的效果和指定"–cols"选项相同。 |
–deselect | 此选项的效果和指定"-N"选项相同。 |
–forest | 此选项的效果和指定"f"选项相同。 |
–headers | 重复显示标题列。 |
–help | 在线帮助。 |
–info | 显示排错信息。 |
–lines<显示列数> | 设置显示画面的列数。 |
–no-headers | 此选项的效果和指定"h"选项相同,只在列表格式方面稍有差异。 |
–group<群组名称> | 此选项的效果和指定"-G"选项相同。 |
–Group<群组识别码> | 此选项的效果和指定"-G"选项相同。 |
–pid<程序识别码> | 此选项的效果和指定"-p"选项相同。 |
–rows<显示列数> | 此选项的效果和指定"–lines"选项相同。 |
–sid<阶段作业> | 此选项的效果和指定"-s"选项相同。 |
–tty<终端机编号> | 此选项的效果和指定"-t"选项相同。 |
–user<用户名称> | 此选项的效果和指定"-U"选项相同。 |
–User<用户识别码> | 此选项的效果和指定"-U"选项相同。 |
–version | 此选项的效果和指定"-V"选项相同。 |
–widty<每列字符数> | 此选项的效果和指定"-cols"选项相同。 |
3. Linux进程状态
- R运行状态(runing):并不意味着进程一定在运行中,也可以在运行队列里;
- S睡眠状态(sleeping):进程在等待事件完成;(浅度睡眠,可以被唤醒)
- D磁盘睡眠状态(Disk sleep):不可中断睡眠(深度睡眠,不可以被唤醒,通常在磁盘写入时发生)
- T停止状态(stopped):可以通过发送SIGSTOP信号给进程来停止进程,可以发送SIGCONT信号让进程继续运行
- X死亡状态(dead):该状态是返回状态,在任务列表中看不到;
- Z僵尸状态(zombie):子进程退出,父进程还在运行,但是父进程没有读到子进程的退出状态,子进程进入僵尸状态;
- t追踪停止状态(trancing stop)
- W 进入内存交换(从内核2.6开始无效)
- < 高优先级
- N 低优先级
- L 有记忆体分页分配并锁在记忆体内 (即时系统或捱A I/O),即,有些页被锁进内存
- s 包含子进程;即进程的领导者(在它之下有子进程);
- + 位于后台的进程组;
- l 多线程,克隆线程 multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
参考:
Linux进程状态解析 之 R、S、D、T、Z、X (主要有三个状态)
https://blog.csdn.net/wudebao5220150/article/details/12919453
4. ps命令三种语法格式
ps命令支持三种使用的语法格式
三种语法格式:
- UNIX 风格,选项可以组合在一起,并且选项前必须有 “-” 连字符
- BSD 风格,选项可以组合在一起,但是选项前不能有 “-” 连字符
- GNU 风格的长选项,选项前有两个 “-” 连字符
能够混用这几种风格,但是可能会发生冲突。较多使用 UNIX 风格的 ps 命令。
5. ps常用指令
ps -ef #用标准格式显示所有当前进程
ps aux #显示所有当前进程
ps -ax #显示所有当前进程
ps -u pungki #根据用户过滤进程;如查询pungki用户的进程
ps aux --sort -pcpu | less # 根据 CPU 使用来对进程升序排序
ps aux| sort -rn -k 3|head # 根据 CPU 使用来对进程降序排序 (head默认是前10行)
ps aux| sort -rn -k 4|head # 根据 内存 使用来对进程降序排序
watch -n 3 'ps -ef|grep python' # 每隔3秒显示python进程的变化情况
watch -n 3 -d 'ps -ef|grep python' # 每隔3秒高亮显示python进程的变化情况
ps aux --sort -pmem | less #根据 内存使用 来升序排序
ps aux --sort -pcpu,+pmem | head -n 10 #查询全10个使用cpu和内存最高的应用
ps -C getty #通过进程名和PID过滤,比如想显示一个名为getty的进程的信息
ps -f -C getty #带格式显示的,通过进程名和PID过滤
ps -L 1213 #根据线程来过滤进程;可以使用-L 参数,后面加上特定进程的PID,查出特定进程的所有线程。
ps axjf(或pstree) #树形显示进程
ps -eo pid,user,args # 显示安全信息
ps -U root -u root u #格式化输出 root 用户(真实的或有效的UID)创建的进程
不要忘了通过 man ps来查看更多的参数
6. ps常见排序键
排序键列表
c cmd 可执行地简单名称
C cmdline 完整命令行
f flags 长模式标志
g pgrp 进程地组ID
G tpgid 控制tty进程组ID
j cutime 累计用户时间
J cstime 累计系统时间
k utime 用户时间
K stime 系统时间
m min_flt 次要页错误地数量
M maj_flt 重点页错误地数量
n cmin_flt 累计次要页错误
N cmaj_flt 累计重点页错误
o session 对话ID
p pid 进程ID
P ppid 父进程ID
r rss 驻留大小
R resident 驻留页
s size 内存大小(千字节)
S share 共享页地数量
t tty tty次要设备号
T start_time 进程启动地时间
U uid UID
u user 用户名
v vsize 总地虚拟内存数量(字节)
y priority 内核调度优先级
7. ps aux
# ps aux
各列的解释:
- USER 进程的用户;
- PID 进程的ID;
- %CPU 进程占用的CPU百分比;
- %MEM 占用内存的百分比;
- VSZ 该进程使用的虚拟内存量(KB);
- RSS 该进程占用的固定内存量(KB);
- TTY 该进程在哪个终端上运行(登陆者的终端位置),若与终端无关, 则显示(?)。若为pts/0等,则表示由网络连接主机进程;
- START 该进程被触发启动时间;
- TIME 该进程实际使用CPU运行的时间;
- COMMAND 命令的名称和参数;
STAT状态位常见的状态字符
D 无法中断的休眠状态(通常 IO 的进程);
R 正在运行可中在队列中可过行的;
S 处于休眠状态;
T 停止或被追踪;
W 进入内存交换 (从内核2.6开始无效);
X 死掉的进程 (基本很少见);
Z 僵尸进程;
< 优先级高的进程;
N 优先级较低的进程;
L 有些页被锁进内存;
s 进程的领导者(在它之下有子进程);
l 多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads);
+ 位于后台的进程组;
参考:
https://blog.csdn.net/weixin_33906657/article/details/94677042
8. ps -ef
其中各列的内容意思如下:
- UID //用户ID、但输出的是用户名
- PID //进程的ID
- PPID //父进程ID
- C //进程占用CPU的百分比
- STIME //进程启动到现在的时间
- TTY //该进程在那个终端上运行,若与终端无关,则显示? 若为pts/0等,则表示由网络连接主机进程。
- CMD //命令的名称和参数
9. ps axjf
其中各列的内容意思如下:
- PPID:父进程ID
- PID:当前进程ID
- PGID:当前进程的进程组ID
- SID:会话ID
- TTY:该进程在哪个终端下运作。( ?表示与终端机无关,例如守护进程; tty1-tty6是本机上的登录者进程; pts/0等表示网络连接进主机的进程)。
- TPGID:前台进程组ID
- STAT:该进程目前的状态
- UID:用户ID
- TIME:该进程实际使用CPU运作的时间
- COMMAND:该进程的实际命令
9.1 PPID、PID、PGID、SID
Linux中,进程都拥有以下的ID
- Process ID(PID)
Linux中标识进程的一个数字,它的值是不确定的,是由系统分配的(但是有一个例外,启动阶段,kernel运行的第一个进程是init,它的PID是1,是所有进程的最原始的父进程),每个进程都有唯一PID,当进程退出运行之后,PID就会回收,可能之后创建的进程会分配这个PID - Parent Process ID(PPID)
字面意思,父进程的PID - Process Group ID(PGID)
PGID就是进程所属的Group的Leader的PID,如果PGID=PID,那么该进程是Group Leader - Session ID(SID)
和PGID非常相似,SID就是进程所属的Session Leader的PID,如果SID==PID,那么该进程是session leader
Session和Group都是管理多个进程的方式,同一个Group的进程属于同一个Session,一个Session里可以包含多个Group。
意义:
- group和session虽然都是进程的集合,但是他们的意义不同。fork出的子进程,会继承group和session(PGID和SID与父进程相同)
session与终端相关(Control terminal),同一个终端启动的进程默认会在一个session里。例如图形界面的终端(比如GNOME按ctrl+atl+T呼出的命令行界面),都是虚拟终端(Virtual terminal),他们实质上只有一个终端在真正起作用,输入w命令,可以看到所有的control terminal。 - group则是方便管理,比如发送信号,kill可以一次向一个group的进程发送同一个信号,ctrl+z进入后台、bg、fg都可以对一个group的进程起作用。比如ctrl+z可以将一个group的进程stop暂停运行,fg可以让一个group继续运行。
参考:
深入理解 Linux的进程,线程,PID,LWP,TID,TGID
https://www.linuxidc.com/Linux/2019-03/157819.htm
9.2 进程间关系(进程组、作业、会话、作业控制有关信号、终端)
https://blog.csdn.net/ZWE7616175/article/details/79979538
10. 格式化输出用户(真实的或有效的UID)创建的进程
ps -U root -u root u
-
-U 参数按真实用户ID(RUID)筛选进程,它会从用户列表中选择真实用户名或 ID。真实用户即实际创建该进程的用户。
-
-u 参数用来筛选有效用户ID(EUID)。
-
最后的u参数用来决定以针对用户的格式输出,由User, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME 和 COMMAND这几列组成。
11. top命令
-
ps 命令可以一次性给出当前系统中进程状态,但使用此方式得到的信息缺乏时效性,并且,如果管理员需要实时监控进程运行情况,就必须不停地执行 ps 命令,这显然是缺乏效率的。
-
为此,Linux 提供了 top 命令。top 命令可以动态地持续监听进程地运行状态,与此同时,该命令还提供了一个交互界面,用户可以根据需要,人性化地定制自己的输出,进而更清楚地了进程的运行状态。
-
top 命令的基本格式如下:
[root@localhost ~]#top [选项]
选项:
-d 秒数:指定 top 命令每隔几秒更新。默认是 3 秒;
-b:使用批处理模式输出。一般和"-n"选项合用,用于把 top 命令重定向到文件中;
-n 次数:指定 top 命令执行的次数。一般和"-"选项合用;
-p 进程PID:仅查看指定 ID 的进程;
-s:使 top 命令在安全模式中运行,避免在交互模式中出现错误;
-u 用户名:只监听某个用户的进程;
在 top 命令的显示窗口中,还可以使用如下按键,进行一下交互操作:
? 或 h:显示交互模式的帮助;
P:按照 CPU
的使用率排序,默认就是此选项;
M:按照内存的使用率排序;
N:按照 PID 排序;
T:按照 CPU 的累积运算时间排序,也就是按照
TIME+ 项排序;
k:按照 PID 给予某个进程一个信号。一般用于中止某个进程,信号 9 是强制中止的信号;
r:按照 PID给某个进程重设优先级(Nice)值; q:退出 top 命令;
top命令解读:
- 第一行:
10:01:23 — 当前系统时间
126 days, 14:29 — 系统已经运行了126天14小时29分钟(在这期间没有重启过)
2 users — 当前有2个用户登录系统
load average: 1.15, 1.42, 1.44 — load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。
load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。
-
第二行:
Tasks — 任务(进程),系统现在共有183个进程,其中处于运行中的有1个,182个在休眠(sleep),stoped状态的有0个,zombie状态(僵尸)的有0个。 -
第三行:cpu状态
6.7% us — 用户空间占用CPU的百分比。
0.4% sy — 内核空间占用CPU的百分比。
0.0% ni — 改变过优先级的进程占用CPU的百分比
92.9% id — 空闲CPU百分比
0.0% wa — IO等待占用CPU的百分比
0.0% hi — 硬中断(Hardware IRQ)占用CPU的百分比
0.0% si — 软中断(Software Interrupts)占用CPU的百分比
在这里CPU的使用比率和windows概念不同,如果你不理解用户空间和内核空间,需要充充电了。
-
第四行:内存状态
8306544k total — 物理内存总量(8GB)
7775876k used — 使用中的内存总量(7.7GB)
530668k free — 空闲内存总量(530M)
79236k buffers — 缓存的内存量 (79M) -
第五行:swap交换分区
2031608k total — 交换区总量(2GB)
2556k used — 使用的交换区总量(2.5M)
2029052k free — 空闲交换区总量(2GB)
4231276k cached — 缓冲的交换区总量(4GB)
这里要说明的是不能用windows的内存概念理解这些数据,如果按windows的方式此台服务器“危矣”:8G的内存总量只剩下530M的可用内存。Linux的内存管理有其特殊性,复杂点需要一本书来说明,这里只是简单说点和我们传统概念(windows)的不同。
第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。
如果出于习惯去计算可用内存数,这里有个近似的计算公式:第四行的free + 第四行的buffers + 第五行的cached,按这个公式此台服务器的可用内存:530668+79236+4231276 = 4.7GB。
对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。
-
第六行是空行
-
第七行以下:各进程(任务)的状态监控
- 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 — 进程名称(命令名/命令行)
如果COMMAND为[defunct],则代表僵尸进程,可kill -9杀掉
12. 杀进程
在Linux下kill进程时,发现程序又自动启动了,这有可能是父进程没kill掉导致的。
解决步骤:
-
- ps -aux 查找到对应进程pid号
-
- cd /proc/PID号
-
- cat status, 找到父进程的PPID号
-
-
先杀掉父进程
kill -9 PPID号
-
-
-
再杀掉子进程
kill -9 PID号
-
参考:
-
kill 和 pgrep 和 pidof 和 awk 和 pkill 和 killall
https://blog.csdn.net/freeking101/article/details/53445749 -
ps命令详解
https://blog.csdn.net/freeking101/article/details/53444530 -
Linux 中ps 和 top命令详解
https://blog.csdn.net/timchen525/article/details/76364706 -
Linux ps命令
https://blog.csdn.net/qq_27870421/article/details/91790800?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control -
10个重要的Linux ps命令实战
https://linux.cn/article-4743-1.html -
进程和作业管理
https://man.linuxde.net/sub/%E8%BF%9B%E7%A8%8B%E5%92%8C%E4%BD%9C%E4%B8%9A%E7%AE%A1%E7%90%86
![](http://spider.ws.126.net/004c0fda73afd75970071698cb696a73.gif)
加星
关注
点赞
谢谢