这篇文章来总结下 Linux 中 ps 命令的常见使用方法,以及如何配合 grep 命令来查找特定的进程。
1. 需求背景
在多人共用 GPU 的服务器上,我们经常使用 nvidia-smi 命令来查看当前 GPU 的占用情况,该命令会列出在哪块 GPU 上有进程在运行,以及该进程的 PID 。下面是一个例子:
1 | +-----------------------------------------------------------------------------+ |
光知道进程的 PID 还不够,有时候我们还想知道这个进程相关的 user 、start time 、CMD 等相关信息,这时候就需要用到 ps 命令和 grep 命令了。
2. ps 命令常见使用方法
ps 命令的全称是 process status,就是进程状态的意思。
ps 命令是一个相当古老的命令,后面可以跟一大堆参数,这篇文章不打算罗列所有的参数,只考虑几个很常见的参数,以及这些参数的某种组合。
常见的参数主要有:
-a: 不和当前登录终端相关的进程;-u: 有效的使用者相关的进程(不太懂);-x: 通常与-a参数一块使用,做详细的输出;-f: 将所有和进程相关的信息都列出,做一个更加完整的输出;-e: 显示所有的进程,和-A参数等价;-A: 显示所有的进程,和-e参数等价。
一些常见的参数组合使用情形如下。
2.1 ps -aux
命令:
1 | ps -aux |
输出结果(截取其中一部分):
1 | USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND |
解释下各个字段的含义。
USER: 很好理解,进程对应的用户名;PID: 很好理解,进程号(process ID);%CPU: CPU 的使用率;%MEM: 内存的使用率;VSZ:使用的虚拟内存大小(virtual size),不重要;TTY: 登录者的终端机位置,不重要;STAT: 进程的状态;START: 进程开始运行的时间;TIME: 此进程实际花费 CPU 的运行时间,不是系统时间;COMMAND: 触发该进程的指令。
该命令默认情况下是按照 PID 升序排列的,有时候我们可能希望其按照 CPU 或者按照内存降序排列,可以按照下面的方法做。
按照 CPU 降序排列:
1 | ps -aux --sort -pcpu |
按照内存使用降序排列:
1 | ps -aux --sort -pmem |
2.2 ps -ef
命令:
1 | ps -ef |
输出结果(截取其中一部分):
1 | UID PID PPID C STIME TTY TIME CMD |
这个命令的输出信息和 ps -aux 其实很像,都能列出当前系统中的所有进程。各个字段的含义如下:
UID: 很好理解,进程对应的用户名;PID: 进程编号;PPID: 父进程编号(parent PID)C: 使用 CPU 的百分比;STIME: 进程开始运行的时间;TTY: 登录者的终端机位置,不重要;TIME: 此进程实际花费 CPU 的运行时间,不是系统时间;CMD: 触发该进程的指令。
2.3 查找某个特定用户的进程
比方说我们系统中有 ubuntu 、root 等多个用户,我只想看 ubuntu 这个用户的进程,可以这样做:
1 | ps -u ubuntu |
输出结果:
1 | PID TTY TIME CMD PID TTY TIME CMD |
各个字段的意思和前面介绍的一致。
2.4 配合管道命令
ps 命令的输出结果往往很长,我们可以通过管道,将输出结果导向 less 、more 命令,方便查看:
1 | ps -aux | less |
1 | ps -ef | more |
当然,如果需要将结果保存到文件,可以使用 输出重定向 功能:
1 | ps -aux >> process.txt # 将结果追加到 process.txt 文件中 |
最强大的还是配合 grep 命令一块使用。
举个例子,我们需要查找进程列表中和 ssh 相关的进程,那就可以这么做:
1 | ps -aux | grep ssh |
输出结果(关键字 ssh 会被标红):
1 | user@DataServer:~$ ps -ef | grep ssh |
另外一个例子,如需求背景部分介绍的,我们使用 nvidia-smi 命令知晓了进程的 PID,那么我们就可以去抓取这个进程更详细的信息:
1 | ps -aux | grep 22244 # 22244 是改进程的 PID |
输出结果:
1 | user@02-P100:~$ ps -aux | grep 22244 |