ps command tutorial
最近发现,经常使用的ps命令,除了会使用一个ps aux | grep xxx
来寻找之外,其他的几乎都不会,比如
- 需要找某个nice值的所有进程
- 需要查看某个priority值的进程的所有子线程
- 需要找消耗cpu最高的进程
- …
等等,发现竟然连ps命令都用不溜,且每次man ps
都是一堆,看都看不仔细,想想有必要总结下常用的命令。
man手册
man ps
查看ps的help手册,其内容有上百行。
命令
ps - report a snapshot of the current processes.
简介
ps是用来显示筛选的活跃进程,top是重复性的更新显示筛选的活跃进程。
注意:ps -aux
与ps aux
是不一样的。在POSIX和UNIX标准中,ps -aux
表示显示用户x所拥有的所有进程信息,如果刚好没有用户x,该命令才会执行ps aux
的功能并给出警告。
实例
-
查看系统中every process信息,标准语法:
ps -e ps -ef ps -eF ps -ely
-
查看系统中every process信息,BSD语法:
ps ax ps axu
-
显示进程树信息:
ps -ejH ps axjf
-
查看线程:
ps -eLf ps axms
-
查看安全信息:
ps -eo euser,ruser,suser,fuser,f,comm,label ps axZ ps -eM
剩余的man手册就是每个选项的含义以及一些显示的含义,我觉得除了很细致的定位问题或者分析某个选项时参考外,其余真的没有读的动力。还不如tldr显示最常用的。
tldr ps
- List all running processes:
ps aux
- List all running processes including the full command string:
ps auxww
- Search for a process that matches a string:
ps aux | grep {{string}}
- List all processes of the current user in extra full format:
ps --user $(id -u) -F
- List all processes of the current user as a tree:
ps --user $(id -u) f
- Get the parent PID of a process:
ps -o ppid= -p {{pid}}
- Sort processes by memory consumption:
ps --sort size
oneliner
这里列举一些常用的实例命令,以便备用查询。其实ps的基本原理也就是通过/proc
文件系统读取进程的信息并显示汇总,所以当遇到比较深入的问题时,可以直接通过/proc
系统来定位。
-
显示所有的active进程信息
ps -A ps -e
ps -A
与ps -e
效果一样,不过这两个命令只显示pid/tty/time/cmd,所以如果只需要搜索pid和cmd相关,可以用该命令。root@pc:~# ps -e | wc -l 214 root@pc:~# ps -A | wc -l 214
-
显示某个pid进程的信息
ps -f -p <pid> # -f参数显示的信息较为齐全
-
显示ppid的进程信息
ps -f --ppid <ppid>
-
显示多个pid的进程信息
ps -fp <pid1>,<pid2>,<pid3>
-
显示指定tty的进程
ps -t tty2 ps -ft pts/0
-
打印进程树process tree
ps -e --forest
-
打印指定进程的进程树信息
ps -f --forest -C sshd ps -ef --forest | grep -v grep | grep sshd
root@pc:~# ps -f --forest -C sshd UID PID PPID C STIME TTY TIME CMD root 679 1 0 8月26 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of root 4653 679 0 8月26 ? 00:00:00 \_ sshd: root@pts/0 root@pc:~# ps -ef --forest | grep -v grep | grep sshd root 679 1 0 8月26 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups root 4653 679 0 8月26 ? 00:00:00 \_ sshd: root@pts/0
-
显示线程信息
- 只显示进程信息
ps H
- 用
-L
参数可以显示线程LWP信息以及NLWP(number of lightweight processes)。
[root@pc:~#] ps -fL -C sshd UID PID PPID LWP C NLWP STIME TTY TIME CMD root 2026 1 2026 0 1 Aug23 ? 00:00:00 /usr/sbin/sshd -D root 28666 2026 28666 0 1 Aug26 ? 00:00:02 sshd: root@pts/4 root 28678 2026 28678 0 1 Aug26 ? 00:00:00 sshd: root@notty root 28737 2026 28737 0 1 Aug26 ? 00:00:01 sshd: root@pts/5 root 28785 2026 28785 0 1 Aug26 ? 00:00:00 sshd: root@notty
-
按照指定格式输出信息
ps L #列出所有的format格式字段 ps -eo pid,ppid,user,cmd #显示所有的进程,并且显示ppid,pid,user,cmd
比如显示指定pid进程的格式化输出信息
[root@pc:~#] ps -p 2026 -o pid,ppid,ni,pri,fgroup,lstart,etime,cmd PID PPID NI PRI FGROUP STARTED ELAPSED CMD 2026 1 0 19 root Tue Aug 23 21:42:37 2022 4-03:49:36 /usr/sbin/sshd -D
比如按照cmd命令行来过滤显示某指定进程
[root@pc:~#] ps -o pid,ppid,ni,pri,fgroup,lstart,etime,cmd -C ssh PID PPID NI PRI FGROUP STARTED ELAPSED CMD 31764 28689 0 19 root Fri Aug 26 05:21:27 2022 1-20:14:38 ssh localhost -p 19888
比如通过pid查找某个进程的cmd
[root@pc:~#] ps -p 31764 -o comm= ssh
-
显示父子进程信息
-
按照进程名来过滤显示
ps -C <xxx>
ps -C <xxx> #比如显示sshd进程 [root@pc:~#] ps -C sshd PID TTY TIME CMD 2026 ? 00:00:00 sshd 28666 ? 00:00:02 sshd 28678 ? 00:00:00 sshd 28737 ? 00:00:01 sshd 28785 ? 00:00:00 sshd
-
过滤某个进程名的所有instance的pid,脚本文件里常用啦过滤
ps -C sshd -o pid= [root@pc:~#] ps -C sshd -o pid= 2026 28666 28678 28737 28785
-
显示进程的已执行时间,比如过滤sshd相关进程的已执行时间
ps -eo comm,etime,user | grep sshd [root@pc:~#] ps -eo comm,etime,user | grep sshd sshd 4-04:03:29 root sshd 1-21:04:06 root sshd 1-21:03:56 root sshd 1-21:03:55 root sshd 1-21:03:45 root
-
-
通过ps来排查性能问题
-
显示CPU使用率最高的进程
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head
比如过滤显示CPU使用率最高的几个进程信息
[root@pc:~#] ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head PID PPID CMD %MEM %CPU 31721 31720 /home/rg/project/qemu-5.1.0 4.8 197 4142 1 /home/rg/project/qemu-5.1.0 5.2 1.5 1595 1 /usr/sbin/NetworkManager -- 0.0 0.1 3252 3053 /usr/bin/gnome-shell 0.3 0.1 1 0 /usr/lib/systemd/systemd -- 0.0 0.0 2 0 [kthreadd] 0.0 0.0 3 2 [rcu_gp] 0.0 0.0 4 2 [rcu_par_gp] 0.0 0.0 5 2 [kworker/0:0-rcu] 0.0 0.0
-
比如显示内存使用率最高的进程信息
[root@pc:~#] ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head PID PPID CMD %MEM %CPU 4142 1 /home/rg/project/qemu-5.1.0 5.2 1.5 31721 31720 /home/rg/project/qemu-5.1.0 4.8 197 3252 3053 /usr/bin/gnome-shell 0.3 0.1 3672 3053 /usr/bin/gnome-software --g 0.1 0.0 2578 2038 /usr/bin/X :0 -background n 0.0 0.0 3902 1 /usr/libexec/gnome-terminal 0.0 0.0 3607 3053 nautilus-desktop --force 0.0 0.0 3419 1 /usr/libexec/goa-daemon 0.0 0.0 2029 1 /usr/sbin/libvirtd 0.0 0.0
-
结合watch命令实时观察
# 比如每隔1s观察CPU使用率最高的信息 watch -n 1 'ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head'
-
-
只显示当前用户的所有的进程信息
ps x
-
显示virtual memory使用情况,%mem就是内存使用情况
[root@pc:~#] ps v PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND 2578 tty1 Ssl+ 0:43 163 2284 515819 95956 0.0 /usr/bin/X :0 -background none -no 3989 pts/0 S 0:00 3 24 232211 7596 0.0 su 3997 pts/0 S+ 0:01 0 885 116050 5056 0.0 bash 4142 pts/0 Sl 96:35 62 11676 30521299 6078572 6.1 /home/rg/project/qemu-5.1.0/bu 19206 pts/5 R+ 0:00 0 90 153245 3720 0.0 ps v 28689 pts/4 Ss 0:00 0 885 115934 4900 0.0 -bash 28796 pts/5 Ss 0:00 0 885 115834 4648 0.0 -bash 31720 pts/4 S 0:00 0 885 112410 2652 0.0 /bin/sh ./init.sh 31721 pts/4 Sl 5270:34 0 11676 13416995 4795852 4.8 /home/rg/project/qemu-5.1.0/bu 31764 pts/4 S+ 0:00 0 727 178164 7076 0.0 ssh localhost -p 19888 43015 pts/1 S 0:00 0 24 232211 7624 0.0 su 43026 pts/1 S+ 0:00 0 885 115858 4912 0.0 bash 45222 pts/2 S 0:00 0 24 232211 8000 0.0 su 45233 pts/2 S+ 0:00 0 885 115858 4608 0.0 bash
-
隐藏ps输出的首行header
ps h