From闻茂泉(广成)AliDataOps
??大概在十多年前,我当时还是一个产品经理。由于一些工作的原因,需要向运维工程师学习一些linux常用命令。当使用linux ps这个十分常用的命令时,遇到了一个小小的疑惑。有些工程师推荐使用ps aux的命令组合,有些工程师推荐使用ps -aux的命令组合,从输出结果上来看似乎也没有什么不同。考虑到如常用的ls -l命令在内,很多linux命令选项前都要加上一个短横线,这么来看似乎ps -axu是正确的。但是一些早期的linux版本,在执行ps -axu时又会报出如下错误Warning: bad syntax,而ps aux却没有这样的报错信息,这么看来似乎ps aux又是正确的。查阅市面上的一些linux书籍,在介绍linux ps命令示例时,有些说用ps aux,而有些又说用ps -axu。实在是让我这个初学者摸不着头脑。
再后来,随着我加入运维团队对linux ps命令逐步深入使用,学会了查看man page和help,发现其中有ps命令的exmaple,果然是ps aux的用法是正确的。不过随着对linux ps命令使用的逐步深入,对ps命令的其他疑问越来越多。比如,我们天天在使用ps命令时输出的%CPU列到底是什么含义?为什么和top显示的%CPU的值有时候差异非常大?再比如,当我使用ps -el命令时,为什么我的进程名是systemd-journald,而ps命令只显示systemd-journal,弄丢了最后1个字母d。
带着这么多疑惑,3年多前我有机会简单的学习了一下linux ps源代码,逐步解开了上面这些疑惑。后来发现公司的很多同事也对ps命令有各种问题和疑问,于是想把之前对ps命令的学习经验总结成文档,供大家参考。希望能给大家带来帮助。
Linux ps命令功能很强大,了解ps命令首先需要从ps命令的选项格式入手。像其他很多linux shell命令一样,ps命令的选项也有长格式和短格式的区别。短选项中也可以带中横线、也可以不带中横线。
根据选项长短和是否有横线的情况,ps命令的选项可以分为以下3类:
不过linux ps命令的长选项并不多,而且几乎每个长选项都有一个功能完全相同的短选项对应。在centos7环境运行如下命令可以见。
在本文中我们将主要介绍BSD和SYSV两种风格的ps命令选项。如果大家有对GNU风格的长选项使用的需求,那么可以参考对应的短选项语法即可。需要注意的是GNU风格选项都是带参数值的,例如--sid 1。
各风格的ps命令选项可以混合使用,比如:
Linux ps命令解析SYSV和BSD风格选项时,会分别将每组字符串都解析成单独的字母。以下三个实例,拆分前后的命令都是等价的。
从示例中可以看出,当SYSV风格语法一个中横线之后有多个字母选项时,拆分后需要给每一个字母前都加上一个中横线。也就是说-elL转换为-e -l -L,而不是转换为-e l L。
从上面例子中也可以看出,ps命令选项除了有是否加中横线的区别,字母大小写也表现为不同的选项含义。英文字母一共26个,SYSV风格选项-A到-Z和-a到-z共52个,BSD风格选项A到Z和a到z共52个。于是ps命令就有一共104个命令选项可能性。
不同版本的ps命令选项的使用可能略有出入,本文主要使用主流的centos7上的procps-ng version 3.3.10版本来说明。在这104个命令选项中,未启用的或曾经使用过现在废弃的命令选项有如下40个,分别是A、B、C、D、E、F、G、I、J、K、P、Q、R、W、Y、b、d、i、y、z、-B、-D、-E、-I、-J、-K、-Q、-R、-S、-W、-X、-Y、-b、-h、-i、-k、-r、-v、-x和-z。