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


ps -o pid,ppid,command?  pthreads ps -o pid,ppid,command    PID    PPID COMMAND2782266   34624 /usr/bin/zsh2825942 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 COMMAND2782266   34624 Ss   /usr/bin/zsh2832729 2782266 SN   ./sleep.out2832740 2782266 R+   ps -o pid,ppid,stat,command在上面当中 STAT 那一列就是表示进程的状态 , 我们现在仔细分析一下上面字母表示的含义:
STAT 当中字母的含义表:
条目含义D表示不能够被中断的睡眠操作 , 比如说IO操作I内核当中的空闲线程R正在执行或者处于就绪队列当中的进程S可以被中断的睡眠 , 一般是等待某个事件触发T被其他的进程发送的信号给停下来了t被调试或者tracing中Z表示这个进程是一个僵尸进程<表示高优先级N表示低优先级L有页面被所在内存当中 , 也就是说这个页面不会被操作系统换出道对换区当中s表示这个进程是一个 session leaderl是一个多线程程序+表示在前台进程组当中

现在根据上面表格当中的内容我们可以知道:
  • 进程 2782266 正在等待某个事件触发 , 而且这个进程是 session leader 。
  • 进程 2832729 也是在等待某个事件触发 , 而且是低优先级的进程 。
  • 进程 2832740 正在执行 。
下图表示 linux 当中进程的几种状态:
这才是使用ps命令的正确姿势

文章插图
我们在来看一个多进程程序的例子:
#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 COMMAND2782266   34624 Ss   /usr/bin/zsh2840012 2782266 SNl  ./sleep.out # 这个进程就是上面那个程序表示的进程2840037 2782266 R+   ps -o pid,ppid,stat,command我们可以看到这个进程的 STAT 当中还有一个 l 表示这是一个多进程的程序 。
总结在本篇文章当中主要给大家介绍了一些常见的 ps 命令的使用方法 , 以及一些常用的输出 , 还有就是输出内容中比较重要的进程状态 , 能够很好的帮助我们实时去了解进程 。

经验总结扩展阅读