初衷
一些无关紧要的 Balabala。
在国内外的各类网站上,关于 Linux 的几乎每一条命令都可以找到很多介绍,其中自然有许多得到了广泛认可的课程和文档。在具有一定基础知识的前提下直接参考这些有价值的资料无疑是具有极高效率的做法,个人写一条介绍命令用法的博客实在是浪费自己的时间和互联网的存储资源。不过我想可以出现的例外就是,有些命令所涉及的知识太繁杂,对像我的新手过于不友好。做个比喻就是,现有资料一部分是厚重的现代汉语词典,一部分是高年级学生做的古诗词小抄,适合我这种低年级的孩子入门的资料稍稍有些少。看到一个很不错的课程挺值得总结一下的,那么...
正文
以下内容的框架借鉴自 Linux Crash Course – The ps Command – Learn Linux TV ,我个人只是根据各类资源将内容稍稍丰富了一下。
ps(Process Status) ,用于展示系统内的进程状态。
NAME
ps - report a snapshot of the current processes.SYNOPSIS
ps [options]
使用不同的 options 控制 ps 命令所展示的进程状态信息。
没有任何选项的 ps 命令
当仅运行 ps
命令时可以看到:
没有任何 option 的 ps 命令仅仅列出了当前终端下的进程。
其中各列的含义为
列名 | 含义 |
---|---|
PID | Process ID,进程的ID |
TTY | 进程所在的 terminal |
TIME | 进程占用CPU的累计时间 |
CMD | 进程对应的指令 |
PID 与 CMD 的概念是一目了然的,而 TTY 和 TIME 则容易牵扯出一些疑惑,TTY 和 Terminal 是什么关系,pts/0 表示什么意思,进程占用 00:00:00 时间的 CPU 又该如何理解?
-
关于 TTY 与 Terminal
Terminal 是一种用于与计算机交互的设备,可以实现文本的输入与输出,在早期以电传打字机(teletypewriter, tty) 的形态出现[1],在当下的 Unix 术语中,两者大致是同义词[2]。详尽地解释它们的概念和渊源实在是费时费力且容易出错,在这里粗略地认为 “Terminal == TTY” 应该是没有问题的。
-
pts/0
pts 是 pseudo terminal slave 的简写。前文所说的 tty 指的是 “a native terminal device, the backend is either hardware or kernel emulated”,可以理解成直接由计算机硬件提供或者操作系统的内核模拟的终端设备,而 pseudo terminal device 则是由 xterm, screen 或 ssh 等程序模拟的终端设备,pseudo terminal slave 即为 slave 端[3]。Master 与 Slave 的具体细节这里就不做讨论了。由于我正在使用 ssh 远程连接到服务器,所以此处显示的是 pts 而非 tty。
当我们使用 MobaXterm 再开启一个字符终端,就会看到 pts/1,以此类推...
-
00:00:00 的 CPU 占用时间
首先,此处的单位仅能精确到秒,当累计占用的时间小于 1s 时,就会出现 00:00:00 的数值,而为什么 bash 这样看起来使用频率很高的指令占用CPU的时间依然小于 1s 呢?
这主要是因为 bash 本身所执行的任务非常简单,bash 仅仅读取指令并且调用相应的可执行程序,所以 bash 所消耗的 CPU 资源是很少的[4]。包括[4]在内的很多文章都提到了通过执行循环使 bash 占用 CPU 的时间超过 1s 的方法,还是挺有意思的。
[1] 终端、Shell、tty 和控制台(console)有什么区别? - 知乎 (zhihu.com)
[2] What is the exact difference between a 'terminal', a 'shell', a 'tty' and a 'console'? - Unix & Linux Stack Exchange
[3] linux - Difference between pts and tty - Unix & Linux Stack Exchange
[4] Why is the TIME 00:00:00 for bash process in ps command - Ask Ubuntu
ps 命令的风格问题
这一部分主要是阐述 ps 命令的三种 option 的风格,本人在刚接触 ps 命令的时候一度以为 ps aux
只是 ps -aux
的简写,但其实只要运行 man ps
命令就可以在开头看到以下相对权威的解释:
This version of ps accepts several kinds of options:
1 UNIX options, which may be grouped and must be preceded by a dash.
2 BSD options, which may be grouped and must not be used with a dash.
3 GNU long options, which are preceded by two dashes.
举例说明:
Unix options 可以分组并且必须一个短划线(dash)开头
ps -a
BSD options 可以分组并且不使用短划线开头
ps a
GNU long options 以两个短划线开头
ps --quick-pid 1
具体含义查找手册即可,此处不再赘述(其实是我自己懒得看了)。
查看更多的进程
在大致了解了以上基本概念之后,就可以运行相对复杂的指令了。
展示所有属于你的进程
ps x
截取 man ps
手册其中一部分
this option causes ps to list all processes owned by you (same EUID as ps), or to list all processes when used together with the a option.
即,单独使用 ps x
将以 EUID 为判断标准,列出所有属于你的进程。此处对 EUID 的概念就先不做解释了。
从图中可以看到,有一些在本终端(pts/0)之下的进程,也有一些 TTY 为 ?的进程。多提一句,如果我们以本用户的身份在开启了多个终端,就会看到 pts/1,pts/2 这些标识。
还有较为特殊的一点便是图中出现了 STAT 列,man ps
手册中的描述如下:
PROCESS STATE CODES
Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") will display to describe the state of a process:
D uninterruptible sleep (usually IO)
I Idle kernel thread
R running or runnable (on run queue)
S interruptible sleep (waiting for an event to complete)
T stopped by job control signal
t stopped by debugger during the tracing
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z defunct ("zombie") process, terminated but not reaped by its parent
For BSD formats and when the stat keyword is used, additional characters may be displayed:
< high-priority (not nice to other users)
N low-priority (nice to other users)
L has pages locked into memory (for real-time and custom IO)
s is a session leader
l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
+ is in the foreground process group
man ps
手册中对 PROCESS STATE CODES 的描述确实也只有这些了,十分的简练。本人对操作系统的知识知之甚少,但还是可以感性地描述途中出现的几个状态。例如图中的 ps x
指令对应的进程状态为 R+
,即正在运行(R)且在前台(+),bash 命令对应的进程状态为 Ss
,即处于可中断地睡眠状态,同时是 session leader,即在它之下有子进程[1]。
[1] Linux进程状态(ps stat)详解 - 火星小编 - 博客园 (cnblogs.com)
查看进程间的关系
用命令行的方式查看进程之间的关系是很有趣的一件事情。man ps
手册中提示我们可以使用两个命令实现这一效果。第一个是 ps -ejH
,其中 -H
用于展示进程的层次结构,-e
用于显示系统内的所有进程;第二个是 ps axjf
。相比之下 ps axjf
使用 ASCII 字符表示树状结构的方式更加直观,如下图所示。
ps -eJH
与 ps axjf
是 man ps
手册中推荐的选项,而 Linux Crash Course 中使用的命令为 ps -axjf
,取得了相同的效果。如果真的探究 -f
的含义,可能就会认为 ps axjf
与 ps -axjf
含义是不同的。这主要是因为 ps
命令自动地识别出了可能的风格混用(这里也许说误用比较好)并将 ps -axjf
转换成了 ps axjf
,具体细节参考这一回答[1]。
man ps
手册中对 f
选项的描述也很简练:
f ASCII art process hierarchy (forest).
关于的 process hierarchy,我们看到的信息主要是围绕父进程与子进程的关系展开的。这一部分内容专业性较强,暂且略过吧。
[1] man - The difference between ps axjf
and ps -axjf
- Unix & Linux Stack Exchange
最常用的命令之一——ps aux
尽管以上说了那么多,但我们在大多数时候可能也仅仅是不假思索地打出最常用的命令,而大部分时候最常用的命令应该就是
ps aux
当然,只要系统内没有名为 x 的用户,ps -aux
也会被自动地解释为 BSD 风格的命令,即 ps aux
,从而达成相同的效果。
阅读 man ps
手册可以看到
a Lift the BSD-style "only yourself" restriction, which is imposed upon the set of all processes when some BSD-style (without "-") options are used or when the ps personality setting is BSD-like. The set of processes selected in this manner is in addition to the set of processes selected by other means. An alternate description is that this option causes ps to list all processes with a terminal (tty), or tolist all processes when used together with the x option.
u Display user-oriented format.
x Lift the BSD-style "must have a tty" restriction, which is imposed upon the set of all processes when some BSD-style (without "-") options are used or when the ps personality setting is BSD-like. The set of processes selected in this manner is in addition to the set of processes selected by other means. An alternate description is that this option causes ps to list all processes owned by you (same EUID as ps), or to list all processes when used together with the a option.
简而言之,ps aux
将展示系统内所有进程的状态并按照 “面向用户的” 的方式整理输出结果,如下图所示:
每一列的具体含义应该都可以在手册中找到解释,Linux Crash Course 中也进行了很多面向实际应用的解释,这里就不赘述了。
标签:ps,processes,入门,00,Linux,进程,options From: https://www.cnblogs.com/lightxy/p/18168195