这才是使用ps命令的正确姿势

前言

在linux系统当中我们通常会使用命令去查看一些系统的进程信息,我们最常使用的就是 ps (process status)。ps 命令主要是用于查看当前正在运行的程序,以及他们相关的的信息,我们可以通过不同的选项进行查看。ps 给我们提供了非常多的选项,这些选项常常令人分辨不清楚,本篇文章我们仔细谈一谈 ps 输出具体的含义。

ps命令详解

只输出跟当前shell有关的进程

当我们在命令行当中直接输入 ps 命令,那么就只能够看到在当前终端当中启动的进程,即使同一个用户启动其他的终端,在这个终端当中也不能看到同一个用户在其他终端启动的进程,如下图所示:

分割线表示上下有两个终端:

  • 我们在上一个终端后台启动一个 sleep.out 的程序,我们就能够在上面的终端里面看到我们刚刚启动的程序。
  • 但是我们在下面同一个用户的不同终端就不能够看到在上面一个终端启动的程序。

ps 命令输出的含义:

  • PID:进程的进程号,有唯一性。
  • TTY:用户登陆的时候使用的虚拟终端。
  • TIME:程序使用的CPU时间总和。
  • CMD:进程启动的时候执行的命令。

输出所有的进程

ps -A
ps -e

上面的两个命令输出系统当中所有的进程信息,我们可以使用这个命令统计系统当中一个有多少进程:

输出所有进程但是排除终端和session leader

ps -a

上面的命令输出除了 session leader 和跟终端无关的所有进程。

  • 跟终端无关的进程很好理解,就是跟终端脱离关系,一般是系统进程和用户的守护进程。
  • 而 session leader 就是你登陆终端时候的那个进程,如下图所示:

一个更具体的描述一个 shell 中 session leader 和其他进程的关系如下图所示(图中最左方就是 session leader 进程):

查看正在运行的程序

ps -r

查看当前用户的进程

ps -x

查看具体某个进程的信息

ps -p pid

输出内容携带用户名

ps -u

查看所有与当前终端有关的进程

这个命令和直接输入ps执行的效果一样

ps -T

一个我们非常熟悉的命令

我们在linux操作系统下面我们通常使用 ps 命令的时候,我们会使用如下两个命令:

ps aux # ax 通常要在一起使用 一起使用时候的效果和 -e 或者 -A 是一样的
ps -ef

其实在很多情况下我们只想查看与我们自己有关的程序,而上面的两个命令还查看了很多其他用户的进程,因此我们可以修改一下上面两个命令:

ps xu

上面这个命令只会输出与我们自己有关的程序同时输出的内容还算完整。

指定ps命令输出的内容

在前面的命令当中我们都没有定制化的输出过一些内容,都是ps命令想输出啥就输出啥!其实我们可以指定ps命令只输出我们需要的内容,比如下面的命令输出进程id,父进程id,以及程序执行时候输入的命令:

ps -o pid,ppid,command
➜  pthreads ps -o pid,ppid,command
PID PPID COMMAND
2782266 34624 /usr/bin/zsh
2825942 2782266 ps -o pid,ppid,command

-o表示指定我们想要输出的内容,在上面的命令当中:

  • pid: 表示当前进程的进程号。
  • ppid: 表示当前进程父进程的进程号。
  • command: 表示执行这个命令的时候输入的命令。

还有很多其他的可以输出的内容,在下表当中列出一些经常使用的条目:

条目 含义
pid 进程号
ppid 父进程进程号
command 执行命令
%cpu 进程对于cpu的使用率
%mem 内存占有率
comm 更加简洁的命令和command一致
cputime 进程累计使用的CPU时间
etime 进程开始执行到现在一共过了多长时间
stat 进程的状态
ni 进程的优先级
user 用户名

这里我们在重点谈一下进程的状态 stat,我们看一个他的输出:

➜  pthreads ps -o pid,ppid,stat,command
PID PPID STAT COMMAND
2782266 34624 Ss /usr/bin/zsh
2832729 2782266 SN ./sleep.out
2832740 2782266 R+ ps -o pid,ppid,stat,command

在上面当中 STAT 那一列就是表示进程的状态,我们现在仔细分析一下上面字母表示的含义:

STAT 当中字母的含义表:

条目 含义
D 表示不能够被中断的睡眠操作,比如说IO操作
I 内核当中的空闲线程
R 正在执行或者处于就绪队列当中的进程
S 可以被中断的睡眠,一般是等待某个事件触发
T 被其他的进程发送的信号给停下来了
t 被调试或者tracing中
Z 表示这个进程是一个僵尸进程
< 表示高优先级
N 表示低优先级
L 有页面被所在内存当中,也就是说这个页面不会被操作系统换出道对换区当中
s 表示这个进程是一个 session leader
l 是一个多线程程序
+ 表示在前台进程组当中

现在根据上面表格当中的内容我们可以知道:

  • 进程 2782266 正在等待某个事件触发,而且这个进程是 session leader。
  • 进程 2832729 也是在等待某个事件触发,而且是低优先级的进程。
  • 进程 2832740 正在执行。

下图表示 linux 当中进程的几种状态:

我们在来看一个多进程程序的例子:


#include <stdio.h>
#include <unistd.h>
#include <pthread.h> void* func(void* args) {
while (1)
{
/* code */
} }
int main() {
for(int i = 0; i < 10; i++) {
pthread_t tid;
pthread_create(&tid, NULL, func, NULL);
}
while (1)
{
sleep(1);
} return 0;
}

上面的程序执行完成之后,ps 的输出结果如下:

➜  pthreads ps -o pid,ppid,stat,command
PID PPID STAT COMMAND
2782266 34624 Ss /usr/bin/zsh
2840012 2782266 SNl ./sleep.out # 这个进程就是上面那个程序表示的进程
2840037 2782266 R+ ps -o pid,ppid,stat,command

我们可以看到这个进程的 STAT 当中还有一个 l 表示这是一个多进程的程序。

总结

在本篇文章当中主要给大家介绍了一些常见的 ps 命令的使用方法,以及一些常用的输出,还有就是输出内容中比较重要的进程状态,能够很好的帮助我们实时去了解进程。


以上就是本篇文章的所有内容了,我是LeHung,我们下期再见!!!更多精彩内容合集可访问项目:https://github.com/Chang-LeHung/CSCore

关注公众号:一无是处的研究僧,了解更多计算机(Java、Python、计算机系统基础、算法与数据结构)知识。

这才是使用ps命令的正确姿势的更多相关文章

  1. Spring Boot 2实现分布式锁——这才是实现分布式锁的正确姿势!

    参考资料 网址 Spring Boot 2实现分布式锁--这才是实现分布式锁的正确姿势! http://www.spring4all.com/article/6892

  2. 这才是Tomcat内存配置的正确姿势

    1.背景 虽然阅读了各大牛的博客或文章,但并没有找到特别全面的关于JVM内存分配方法的文章,很多都是复制黏贴 为了严谨,本文特别备注只介绍基于HotSpot VM虚拟机,并且基于JDK1.7的内存分配 ...

  3. ps命令详解(转)

    原文地址:http://apps.hi.baidu.com/share/detail/32573968 有时候系统管理员可能只关心现在系统中运行着哪些程序,而不想知道有哪些进程在运行.由于一个应用程序 ...

  4. ps 命令详解

    有时候系统管理员可能只关心现在系统中运行着哪些程序,而不想知道有哪些进程在运行.由于一个应用程序可能需要启动多个进程.所以在同等情况下,进程的数 量要比程序多的多.为此从阅读方面考虑,管理员需要知道系 ...

  5. linux命令之ps命令

    1.管道 linux命令管道通过|表示.一般在linux命令中|(管道)之前的命令会输出大量的结果,|(管道)之后的命令一般就是带有条件的,只将|前满足条件的结果显示出来. 2.grep命令 grep ...

  6. linux 命令——PS命令

    首先要明白什么是进程进程是一个正在运行的程序.也就是说在Linux系统上运行的所有东西都是进程.和进程相比较,作业是一系列按一定顺序执行的命令.一条简单的命令可能会涉及多个进程,尤其是当使用管道和重定 ...

  7. ps 命令的详细功能解析

    转自:http://www.cnblogs.com/wangkangluo1/archive/2011/09/23/2185938.html 要对进程进行监测和控制,首先必须要了解当前进程的情况,也就 ...

  8. [转]ps命令详解

    原文地址:http://apps.hi.baidu.com/share/detail/32573968 转载自:http://www.cnblogs.com/wangkangluo1/archive/ ...

  9. linux每日命令(34):ps命令和pstree命令

    Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...

随机推荐

  1. ShardingSphere-JDBC实战

    一.环境准备 1.数据库 创建2个库2个表: xdclass_shop_order_0 product_order_0 product_order_1 ad_config product_order_ ...

  2. Chapter 09 - NSUndoManager (C#实现 + 全网原创)

    此例子针对NSDocument实现了tableview 每一行添加/删除的undo/redo,以及每一个单元格内容编辑的undo/redo.基于NSDocument类的实现.PersonModel + ...

  3. JAVA反序列化漏洞修复解决方法

    MyObject类建立了Serializable模块,而且重新写过了readObject()变量,仅有建立了Serializable模块的类的目标才能够被实例化,沒有建立此模块的类将无法使他们的任意状 ...

  4. 通过ftutilx 插件实现流版式文件全文检索

    Oracle 支持流版式文件的全文检索,而原生的PostgreSQL是不支持流版式文件全文检索的.KingbaseES 通过ftutilx 插件将流版式文件转换成文本文件,从而支持流版式文件全文检索. ...

  5. KingbaseES R6 集群修改物理IP和VIP案例

    在用户的实际环境里,可能有时需要修改主机的IP,这就涉及到集群的配置修改.以下以例子的方式,介绍下KingbaseES R6集群如何修改IP. 一.案例测试环境 操作系统: [KINGBASE@nod ...

  6. java的数据类型分为两大类

    java的数据类型分为两大类 基本类型(primitive type) 数据类型 整数类型 byte占一个字节范围:-128-127 short占两个字节范围:-32768-32767 int占四个字 ...

  7. 硬核剖析Redis单线程为什么那么快?

    (本文首发于"数据库架构师"公号,订阅"数据库架构师"公号,一起学习数据库技术,助力职业发展) Redis目前是使用率最高的内存库数据库,是企业应用开发的必备, ...

  8. Linux安装gitlab仓库

    linux安装gitlab仓库 注:此安装方式是安装在docker上 1. 安装docker 可根据链接文档进行操作安装 https://www.cnblogs.com/cherish-sweet/p ...

  9. js 对象的深复制 解决不能复制undefined (递归)

    用普通的拷贝  JSON.parse和 JSON.stringify 进行对象拷贝是不会拷贝undefined //普通的拷贝   const obj = {         a: {         ...

  10. 痞子衡嵌入式:理解i.MXRT中FlexSPI外设lookupTable里配置访问行列混合寻址Memory的参数值

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT中FlexSPI外设lookupTable里配置访问行列混合寻址Memory的参数值. 关于 FlexSPI 外设的 loo ...