Linux学习记录:ps命令以及和grep配合使用

这篇文章来总结下 Linux 中 ps 命令的常见使用方法,以及如何配合 grep 命令来查找特定的进程。

1. 需求背景

在多人共用 GPU 的服务器上,我们经常使用 nvidia-smi 命令来查看当前 GPU 的占用情况,该命令会列出在哪块 GPU 上有进程在运行,以及该进程的 PID 。下面是一个例子:

1
2
3
4
5
6
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 1 22244 C python3 7719MiB |
+-----------------------------------------------------------------------------+

光知道进程的 PID 还不够,有时候我们还想知道这个进程相关的 userstart timeCMD 等相关信息,这时候就需要用到 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
2
3
4
5
6
7
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root 1 0.0 0.0 119968 5212 ? Ss Jan12 27:04 /sbin/init
root 2 0.0 0.0 0 0 ? S Jan12 0:03 [kthreadd]
root 3 0.0 0.0 0 0 ? S Jan12 1:21 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< Jan12 0:00 [kworker/0:0H]
root 8 0.1 0.0 0 0 ? S Jan12 177:36 [rcu_sched]
root 9 0.0 0.0 0 0 ? S Jan12 0:00 [rcu_bh]

解释下各个字段的含义。

  • 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
2
3
4
5
6
7
UID        PID  PPID  C STIME TTY          TIME CMD
root 1 0 0 Jan12 ? 00:27:04 /sbin/init
root 2 0 0 Jan12 ? 00:00:03 [kthreadd]
root 3 2 0 Jan12 ? 00:01:21 [ksoftirqd/0]
root 5 2 0 Jan12 ? 00:00:00 [kworker/0:0H]
root 8 2 0 Jan12 ? 02:57:37 [rcu_sched]
root 9 2 0 Jan12 ? 00:00:00 [rcu_bh]

这个命令的输出信息和 ps -aux 其实很像,都能列出当前系统中的所有进程。各个字段的含义如下:

  • UID : 很好理解,进程对应的用户名;
  • PID : 进程编号;
  • PPID : 父进程编号(parent PID)
  • C : 使用 CPU 的百分比;
  • STIME : 进程开始运行的时间;
  • TTY : 登录者的终端机位置,不重要;
  • TIME : 此进程实际花费 CPU 的运行时间,不是系统时间;
  • CMD : 触发该进程的指令。
2.3 查找某个特定用户的进程

比方说我们系统中有 ubunturoot 等多个用户,我只想看 ubuntu 这个用户的进程,可以这样做:

1
ps -u ubuntu

输出结果:

1
2
3
4
5
6
7
8
9
  PID TTY          TIME CMD  PID TTY          TIME CMD
11193 ? 00:00:00 systemd
11194 ? 00:00:00 (sd-pam)
12676 ? 00:00:00 sshd
12677 pts/0 00:00:00 bash
18631 pts/0 00:00:00 ps
18632 pts/0 00:00:00 less
20491 ? 00:00:13 tmux: server
32357 pts/1 00:00:00 bash

各个字段的意思和前面介绍的一致。

2.4 配合管道命令

ps 命令的输出结果往往很长,我们可以通过管道,将输出结果导向 lessmore 命令,方便查看:

1
ps -aux | less
1
ps -ef | more

当然,如果需要将结果保存到文件,可以使用 输出重定向 功能:

1
ps -aux >> process.txt  # 将结果追加到 process.txt 文件中

最强大的还是配合 grep 命令一块使用。

举个例子,我们需要查找进程列表中和 ssh 相关的进程,那就可以这么做:

1
ps -aux | grep ssh

输出结果(关键字 ssh 会被标红):

1
2
3
4
5
6
7
8
9
10
11
12
user@DataServer:~$ ps -ef | grep ssh
root 344 2945 0 16:45 ? 00:00:00 sshd: user [priv]
user 392 344 0 16:45 ? 00:00:00 sshd: user@notty
user 393 392 0 16:45 ? 00:00:00 /usr/lib/openssh/sftp-server
root 2945 1 0 Jan12 ? 00:00:53 /usr/sbin/sshd -D
root 5099 2945 0 17:45 ? 00:00:00 sshd: user [priv]
user 5147 5099 0 17:45 ? 00:00:00 sshd: user@notty
user 5148 5147 0 17:45 ? 00:00:00 /usr/lib/openssh/sftp-server
root 5434 2945 0 17:52 ? 00:00:00 sshd: user [priv]
user 5482 5434 0 17:52 ? 00:00:00 sshd: user@pts/20
user 5506 5483 0 17:52 pts/20 00:00:00 ssh s4.linkeservers.ml
user 5511 40663 0 17:52 pts/19 00:00:00 grep --color=auto ssh

另外一个例子,如需求背景部分介绍的,我们使用 nvidia-smi 命令知晓了进程的 PID,那么我们就可以去抓取这个进程更详细的信息:

1
ps -aux | grep 22244 # 22244 是改进程的 PID

输出结果:

1
2
3
4
5
user@02-P100:~$ ps -aux | grep 22244
root 22244 115 2.1 32012712 2755640 pts/0 Rl 17:44 14:32 python3 ./pytorch/train.py train --config_path=/TANet/pointpillars_with_TANet/secon
d/configs/pointpillars/ped_cycle/xyres_16.proto --model_dir=/TANet/pointpillars_with_TANet/ped_calib_PSA_CBAM --fusion_weight 1 --image_weight 0 --l
idar_weight 0
user 22893 0.0 0.0 14680 936 pts/1 S+ 17:57 0:00 grep --color=auto 22244

3. References

Donate comment here