这才是使用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 命令的时候,我们会使用如下两个命令:

扫描二维码关注公众号,回复: 14540947 查看本文章

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 表示这是一个多进程的程序。

猜你喜欢

转载自blog.csdn.net/weixin_43214644/article/details/127504743
今日推荐