首页 > 系统相关 >较为平滑的 Linux ps 命令入门

较为平滑的 Linux ps 命令入门

时间:2024-04-30 16:14:22浏览次数:25  
标签:ps processes 入门 00 Linux 进程 options

初衷

一些无关紧要的 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 -eJHps axjfman ps 手册中推荐的选项,而 Linux Crash Course 中使用的命令为 ps -axjf,取得了相同的效果。如果真的探究 -f 的含义,可能就会认为 ps axjfps -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 将展示系统内所有进程的状态并按照 “面向用户的” 的方式整理输出结果,如下图所示:

psaux

每一列的具体含义应该都可以在手册中找到解释,Linux Crash Course 中也进行了很多面向实际应用的解释,这里就不赘述了。

标签:ps,processes,入门,00,Linux,进程,options
From: https://www.cnblogs.com/lightxy/p/18168195

相关文章

  • 20_Linux I2C 驱动
    LinuxI2C驱动一.I2C简介I2C是很常见的一种总线协议,I2C是NXP公司设计的,I2C使用两条线在主控制器和从机之间进行数据通信。一条是SCL(串行时钟线),另外一条是SDA(串行数据线),因为I2C这两条数据线是开漏输出的,所以需要接上拉电阻,总线空闲的时候SCL和SDA处于高电平。I2C......
  • 17_Linux中断
    Linux中断1.什么是中断?CPU在正常运行期间,由外部或者内部引起的事件,让CPU停下当前正在运行的程序,转而去执行触发他的中断所对应的程序,这个就是中断。举例:我现在正在厨房做饭,突然电话响了,然后我关火去接电话,接完电话在回去开火继续做饭,这个过程就是中断的一个过程。在这个看似......
  • Linux图形化界面怎么进入?CentOS 7图形界面切换
    CentOS 7默认只安装命令行界面。要切换到图形界面,需要先检查系统是否安装图形界面,在终端输入以下命令:systemctlget-default若是返回结果是“multi-user.target”表示系统没有安装图形界面;若是返回结果是“graphical.target“表示系统安装了图形界面。 另外如果你的Cent......
  • TypeScript入门5:模块化(导入导出)
    1.概述2.语法3.避免命名冲突4.默认导入导出......
  • TypeScript入门3:接口、多态
    //接口:通常情况下,接⼝中只会包含属性和⽅法的声明,⽽不包含具体的实现细节,具体的细节由其实现类完成interfacePerson9{id:number;name:string;age:number;introduce():void;}//实现类中,需要包含接⼝属性的赋值逻辑,以及接⼝⽅法的实现逻辑classStudent9im......
  • TypeScript入门2:类、继承、访问修饰符
    classPerson{//实例属性id:number;name:string;age:number=18;//构造函数constructor(id:number,name:string){this.id=id;this.name=name;}//实例方法introduce():string{return`hello,Iam${this.name},and......
  • Go语言系列——数组和切片、可变参数函数、Maps、字符串、指针、结构体、方法、接口(一
    文章目录11-数组和切片数组数组的声明数组是值类型数组的长度使用range迭代数组多维数组切片创建一个切片切片的修改切片的长度和容量使用make创建一个切片追加切片元素切片的函数传递多维切片内存优化12-可变参数函数什么是可变参数函数语法通过一些例子理解可变参......
  • TypeScript入门1:注释、变量常量、数据类型、函数
    console.log('hits');//声明变量leta:number=10;//声明常量constb:number=20;//类型推断:如果⼀个变量或常量的声明包含了初始值,TS便可以根据初始值进⾏类型推断,此时可以不显式指定其类型letc=60;console.log(typeofc);//number//数字类型:整数和浮点......
  • 自动批量实现linux机器ssh免密shell脚本
    要同时指定SSH端口和密码来实现非交互式地使用ssh-copy-id,可以使用sshpass来实现。sshpass是一个用于通过非交互方式输入密码的工具。下面是一个示例脚本,它使用sshpass、ssh-copy-id以及指定的端口号来实现这一目标:1#!/bin/bash23#检查是否提供了目标主机列表文件4i......
  • Linux 下以其他用户身份运行程序—— su、sudo、runuser
    转自:https://blog.csdn.net/u011250186/article/details/106335028/本文综合分析了Linux系统下,如何使用runuser命令、su命令和sudo命令以其他用户身份来运行程序,以及这三个命令的运行效率比较。 一、su命令临时切换用户身份SU:(Switchuser切换用户),可让一个普通用户切换为......