在 Linux 上运行以下命令时,我得到了奇怪的输出,包括我的旧 makefile 输出和进程树
ps axuwfw
另外,以下命令有什么用处以及它是如何工作的?
ps axuwfw | grep -v grep | grep -i screen
ps axuwfw | grep -v grep | grep -i tmux
上述两个命令在示例中返回 431 和 7这里,但在我的系统中,它返回一些以前运行过的旧 makefile 输出和截断的进程树。
答案1
ps axuwfw
这是几个 BSD 风格选项的组合(所有选项都在手册页中man ps
):
a
:包括其他用户的进程x
:包括没有终端的进程u
:显示面向用户的信息字段w
:宽输出(132 列而不是 80 列)f
:“森林”:进程的树形视图w
:更宽的输出(没有任何限制)
换句话说,它只是显示当前正在运行的进程。
然而,如果你看到老的进程,检查它们的“STAT”字段——如果它显示Z
,则表示该进程已退出,但其父进程尚未“收割”它;该进程是“僵尸”。这通常表示父进程存在轻微错误,或已挂起/崩溃。
另请注意,并非所有操作系统都接受这些选项。在 SysV 上,可能是ps -ef
。
ps axuwfw | grep -v grep | grep -i screen
是|
一个管道。它将一个命令的输出重定向到另一个命令的输入。这应该更明显地表明,上面的命令不仅仅是一个奇怪的神奇命令;它是三个相互关联的命令。
第一个命令,,
ps axuwfw
已经解释过了。grep
,用于搜索/过滤文本。grep foo
只会打印包含文本“foo”的输入行。使用选项-v
,第二个命令 –grep -v …
– 执行相反的操作 – 打印不包含文本“foo”的行不是匹配。(再次参考man grep
或grep --help
。)此特定调用是必要的,因为管道中的所有进程都同时运行,因此将
ps…
显示所有grep…
进程 - 并且ps axu | grep screen
会导致grep…
除了所需的条目之外还匹配其自己的条目。因此grep…
添加了第二个以明确忽略其中包含“grep”的行。(当然,还有更好的工具,比如
pgrep -alf screen
,但许多人仍然使用这种ps|grep|grep…
管道,只是因为只需了解ps
和就可以轻松结合起来grep
。)第三个命令
grep -i screen
,再次仅提取包含“screen”的行。正如手册页和
grep --help
输出中所述,添加该-i
选项会使搜索不区分大小写,因此它还会输出其中包含“Screen”或“SCREEN”的行。
简而言之,完整的命令只是打印那些ps…
谈论“屏幕”程序的行。
“上面的两个命令在此处的示例中返回 431 和 7...”
它们不会。它们返回有关名为“screen”或“tmux”的进程的信息。示例中给出的数字是数数返回的进程数。
幻灯片的作者没有包含完整的输出(这实际上并不相关);他们只包含了总数作为摘要,表明“screen”用户比“tmux”用户多 60 倍。
如果你希望命令真正为你计算行数,你可以 a) 将-c
(count) 选项添加到最后的 grep…
命令,或者 b) 通过管道传输| wc -l
。 (两种方法均可。)
“…但在我的系统中它返回的是垃圾。”
它返回一些以前运行过的旧 makefile 输出和截断的进程树
这不是垃圾——这正是您要求的输出。