常见linux命令介绍-ps

本文前半部分自:https://www.yanbinghu.com/2018/04/06/53515.html


前言

ps(Process Status)命令是linux中最常见的命令之一,它用来列出当前系统运行中的进程的状态信息。当然了,它只显示命令执行时的进程状态,如果想要动态列出状态信息,可以选择使用top命令。那么通过ps命令我们能够知道进程的哪些信息呢?下面进行介绍。


命令基本介绍

命令格式

ps命令基本格式为:
ps [options]


常用参数
-A    显示所有进程(同-e)
-a    显示当前终端的所有进程
-u    显示进程的用户信息
-o    以用户自定义形式显示进程信息
-f    显示程序间的关系

对于更多参数的介绍,可使用命令man ps查看,这里不再赘述。


字段含义

在介绍实例之前,需要先了解一下ps命令输出各字段的含义,这样我们才能更好地理解所展示的信息。常见字段的基本含义如下:

USER          进程所有者的用户名
PID           进程号
START         进程激活时间
%CPU          进程自最近一次刷新以来所占用的CPU时间和总时间的百分比
%MEM          进程使用内存的百分比
VSZ           进程使用的虚拟内存大小,以K为单位
RSS           驻留空间的大小。显示当前常驻内存的程序的K字节数。
TTY           进程相关的终端
STAT          进程状态,包括下面的状态: 
                     D    不可中断     Uninterruptible sleep (usually IO)
                     R    正在运行,或在队列中的进程
                     S    处于休眠状态
                     T    停止或被追踪
                     Z    僵尸进程
                     W    进入内存交换(从内核2.6开始无效)
                     X    死掉的进程
                     <    高优先级
                     N    低优先级
                     L    有些页被锁进内存
                     s    包含子进程
                     \+   位于后台的进程组;
                     l    多线程,克隆线程

TIME          进程使用的总CPU时间
COMMAND       被执行的命令行
NI            进程的优先级值,较小的数字意味着占用较少的CPU时间
PRI           进程优先级。
PPID          父进程ID
WCHAN         进程等待的内核事件名

常见用法

下面来看看一些常见用法。

显示所有进程信息
ps -A
 PID TTY          TIME CMD
    1 ?        00:00:03 systemd
    2 ?        00:00:00 kthreadd
    4 ?        00:00:00 kworker/0:0H
    6 ?        00:00:00 mm_percpu_wq
    7 ?        00:00:00 ksoftirqd/0
    8 ?        00:00:02 rcu_sched
    9 ?        00:00:00 rcu_bh
   10 ?        00:00:00 migration/0
   11 ?        00:00:00 watchdog/0
(内容较多,其他部分略过。)

虽然能显示所有进程,但是显示的信息却不多,基本只显示了进程id和进程名,有时候并不实用。


显示所有进程基本信息

相关参数 -e

ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 10:52 ?        00:00:03 /sbin/init splash
root         2     0  0 10:52 ?        00:00:00 [kthreadd]
root         4     2  0 10:52 ?        00:00:00 [kworker/0:0H]
root         6     2  0 10:52 ?        00:00:00 [mm_percpu_wq]
root         7     2  0 10:52 ?        00:00:00 [ksoftirqd/0]
root         8     2  0 10:52 ?        00:00:02 [rcu_sched]
root         9     2  0 10:52 ?        00:00:00 [rcu_bh]
root        10     2  0 10:52 ?        00:00:00 [migration/0]
(内容较多,其他部分略过。)

这个时候已经显示较多信息了。


显示指定用户的进程

相关参数-u

ps -u root
  PID TTY          TIME CMD
    1 ?        00:00:03 systemd
    2 ?        00:00:00 kthreadd
    4 ?        00:00:00 kworker/0:0H
    6 ?        00:00:00 mm_percpu_wq
    7 ?        00:00:00 ksoftirqd/0
    8 ?        00:00:03 rcu_sched
    9 ?        00:00:00 rcu_bh

查看指定进程名相关信息

这个时候就需要配合grep使用了。
例如,查看”java“相关进程:

ps -ef |grep java
root       2685  2684  2 10:55 pts/0    00:01:19 java -jar ./software/finalspeed/finalspeed_client.jar
root       5423  4487  0 11:55 pts/20   00:00:00 grep --color=auto java

查看进程占用内存,cpu利用率等信息
ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0 185488  6188 ?        Ss   10:52   0:03 /sbin/init splash
root         2  0.0  0.0      0     0 ?        S    10:52   0:00 [kthreadd]
root         4  0.0  0.0      0     0 ?        S<   10:52   0:00 [kworker/0:0H]
root         6  0.0  0.0      0     0 ?        S<   10:52   0:00 [mm_percpu_wq]

从上面的信息,可以看到进程的所有者、cpu占用率、内存占用率等较为详细的信息。


显示线程相关信息

相关参数-l

ps -elf

查看进程间的关系

相关参数-H,进程间关系以树形图的方式展示:

ps -ejH

查看进程的指定字段信息

有时候可能比较关注某些进程信息,ps -o可以指定要显示的列
例如:

ps -eo %cpu,%mem,vsz,rsz,start,stat,pid,sid,ni,uid,user,rss,time,command
.0  0.0      0     0 10:52:51 S      365     0   -     0 root         0 00:00:00 [irq/47-mei_me]
 0.0  0.0      0     0 10:52:51 S<     373     0 -20     0 root         0 00:00:00 [cfg80211]
 0.0  0.0      0     0 10:52:52 S<     402     0 -20     0 root         0 00:00:00 [ktpacpid]
 0.0  0.0      0     0 10:52:56 S      669     0   0     0 root         0 00:00:00 [jbd2/sda15-8]
 0.0  0.0      0     0 10:52:56 S<     670     0 -20     0 root         0 00:00:00 [ext4-rsv-conver]
 0.0  0.0      0     0 10:52:57 S      676     0   0     0 root         0 00:00:00 [jbd2/sda11-8]
 0.0  0.0      0     0 10:52:57 S<     677     0 -20     0 root         0 00:00:00 [ext4-rsv-conver]
 0.0  0.0      0     0 10:52:58 S      683     0   0     0 root         0 00:00:00 [jbd2/sda14-8]
 0.0  0.0      0     0 10:52:58 S<     684     0 -20     0 root         0 00:00:00 [ext4-rsv-conver]

查看指定进程指定信息

只需要在最后指定—pid参数即可。
例如:

ps -o %cpu,%mem,vsz,rsz,start,stat,pid,sid,ni,uid,user,rss,time,command --pid 2685

%CPU %MEM    VSZ   RSZ  STARTED STAT   PID   SID  NI   UID USER       RSS     TIME COMMAND
 2.0  1.9 5740448 159796 10:55:24 Sl+ 2685  2583   0  1000 hyb      159796 00:01:46 java -jar ./software/finalspeed/finalspeed_client.jar

进程太多时分页显示

如果进程信息较多,可能一页无法完成显示,这时可以配合使用more命令
例如:

ps -aux|more

多进程python程序实例

我编写了一个多进程的python程序来使用上面的命令,该程序 python3.6 也可以执行

test.py

from multiprocessing.pool import Pool
from time import sleep
import os

def run(name):
    print("%s子进程开始,进程ID:%d" % (name, os.getpid()))
    sleep(100)
    print('end')
  


if __name__ == "__main__":
    print(f"父进程开始,进程ID:{os.getpid()}")
    # 创建多个进程,表示可以同时执行的进程数量。默认大小是CPU的核心数
    p = Pool(4)
    for i in range(10):
        # 创建进程,放入进程池统一管理
        p.apply_async(run, args=(i,))  #p.apply同步方式运行
    # 如果我们用的是进程池,在调用join()之前必须要先close(),
    # 并且在close()之后不能再继续往进程池添加新的进程
    p.close()
    # 进程池对象调用join,会等待进程池中所有的子进程结束完毕再去结束父进程
    p.join()
    print("父进程结束。")
    p.terminate()

# 
# close():温柔的结束进程,会等待任务执行完成。
#如果我们用的是进程池,在调用join()之前必须要先close(),
#并且在close()之后不能再继续往进程池添加新的进程
# join():进程池对象调用join,会等待进程池中所有的子进程结束完毕再去结束父进程
# terminate():一旦运行到此步,不管任务是否完成,立即终止。
[root@web02 ~]# python3.7 test.py
父进程开始,进程ID:20054
0子进程开始,进程ID:20055
1子进程开始,进程ID:20056
2子进程开始,进程ID:20057
3子进程开始,进程ID:20058

打印一个进程树:
[root@web02 ~]# ps axjf | grep test
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
 8501 20054 20054  8501 pts/0    20054 Sl+      0   0:00  |       \_ python3.7 test.py
20054 20055 20054  8501 pts/0    20054 S+       0   0:00  |           \_ python3.7 test.py
20054 20056 20054  8501 pts/0    20054 S+       0   0:00  |           \_ python3.7 test.py
20054 20057 20054  8501 pts/0    20054 S+       0   0:00  |           \_ python3.7 test.py
20054 20058 20054  8501 pts/0    20054 S+       0   0:00  |           \_ python3.7 test.py
17000 20504 20503 17000 pts/1    20503 S+       0   0:00          \_ grep --color=auto test
[root@web02 ~]# pstree -p 20054
python3.7(20054)─┬─python3.7(20055)
                 ├─python3.7(20056)
                 ├─python3.7(20057)
                 ├─python3.7(20058)
                 ├─{python3.7}(20059)
                 ├─{python3.7}(20060)
                 └─{python3.7}(20061)

pstree 命令需要安装 yum -y install psmisc


获取线程的信息
[root@web02 ~]# ps -efL | grep test.py
UID        PID  PPID   LWP  C NLWP STIME TTY          TIME CMD
root     20054  8501 20054  0    4 11:06 pts/0    00:00:00 python3.7 test.py
root     20054  8501 20059  0    4 11:06 pts/0    00:00:00 python3.7 test.py
root     20054  8501 20060  0    4 11:06 pts/0    00:00:00 python3.7 test.py
root     20054  8501 20061  0    4 11:06 pts/0    00:00:00 python3.7 test.py
root     20055 20054 20055  0    1 11:06 pts/0    00:00:00 python3.7 test.py
root     20056 20054 20056  0    1 11:06 pts/0    00:00:00 python3.7 test.py
root     20057 20054 20057  0    1 11:06 pts/0    00:00:00 python3.7 test.py
root     20058 20054 20058  0    1 11:06 pts/0    00:00:00 python3.7 test.py
root     20870 17000 20870  0    1 11:09 pts/1    00:00:00 grep --color=auto test.py

man 手册中的一些示例(man ps)

使用标准语法查看系统中的每个进程:
ps -e
ps -ef

使用标准语法查看系统中的每个进程:
ps -e
ps -ef
ps -eF
ps -ely

使用BSD语法查看系统中的每个进程:
ps ax
ps axu

打印一个进程树:

ps -ejH
ps axjf

获取线程的信息:
ps -eLf
ps axms

要查看以root(真实和有效的ID)身份运行的每个进程,以用户格式:
ps -U root -U root u

只打印PID 42的名称:
ps -q 42 -o comm=
 
以用户定义的格式查看每个进程:
ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
ps -Ao pid,tt,user,fname,tmout,f,wchan        
总结

ps命令也是在linux下常用命令之一,通过它我们可以了解更多进程的相关信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值