这篇文章来总结下 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 |