《Linux命令行和shell脚本编程大全》第四章阅读笔记

一、监测程序

1.探查进程

当程序在系统中运行时,它被称为进程(process) 。要想监测这些进程,必须熟悉 ps 命令的用法。ps 命令能够输出系统中运行的所有程序的大量信息。

在默认情况下,ps 命令并没有提供太多的信息

ps 命令默认只显示运行在当前终端中属于当前用户的那些进程。ps 命令的基本输出显示了程序的进程 ID(process ID,PID)、进程运行在哪个终端(TTY)及其占用的 CPU 时间。

Linux 系统中使用的 GNU ps 命令支持以下 3 种类型的命令行选项

  • Unix 风格选项,选项前加单连字符;
  • BSD 风格选项,选项前不加连字符;
  • GNU 长选项,选项前加双连字符。

(1)Unix 风格选项


使用 ps 命令的关键不在于记住所有可用的选项,而在于记住对你来说最有用的那些。大多数 Linux 系统管理员会牢记自己的一组常用选项,以用来提取有用的进程信息。如果需要查看系统中运行的所有进程,可以使用-ef 选项组合

UID:启动该进程的用户。

PID:进程 ID。

PPID:父进程的 PID(如果该进程是由另一个进程启动的)。

C:进程生命期中的 CPU 利用率。

STIME:进程启动时的系统时间。

TTY:进程是从哪个终端设备启动的。

TIME:运行进程的累计 CPU 时间。

CMD:启动的程序名称。

如果还想获得更多的信息,可以使用-l 选项,产生长格式输出。

使用了-l 选项之后多出的那几列

F:内核分配给进程的系统标志。

S:进程的状态(O 代表正在运行;S 代表在休眠;R 代表可运行,正等待运行;Z 代表僵化,已终止但找不到其父进程;T 代表停止)。

PRI:进程的优先级(数字越大,优先级越低)。

NI:谦让度(nice),用于决定优先级。

ADDR:进程的内存地址。

SZ:进程被换出时所需交换空间的大致大小。

WCHAN:进程休眠的内核函数地址。

(2)BSD 风格选项

了解了 Unix 风格选项之后,来看看 BSD 风格选项。伯克利软件发行版(Berkeley Software Distribution,BSD)是加州大学伯克利分校开发的一个 Unix 版本。

Unix 和 BSD 风格的选项有很多重叠之处。从一种风格的选项中得到的信息基本上也能从另一种风格中获取。大部分时候,只要选择自己喜欢的风格即可

在使用 BSD 风格的选项时,ps 命令会自动改变输出以模仿 BSD 格式。

VSZ:进程占用的虚拟内存大小(以 KB 为单位)。

RSS:进程在未被交换出时占用的物理内存大小。

STAT:代表当前进程状态的多字符状态码。

很多系统管理员喜欢 BSD 风格的 l 选项,因为能输出更详细的进程状态码(STAT 列)。多字符状态码能比 Unix 风格输出的单字符状态码更清楚地表明进程的当前状态。

第一个字符采用了与 Unix 风格的 S 输出列相同的值,表明进程是在休眠、运行还是等待。第二个字符进一步说明了进程的状态。

<:该进程以高优先级运行。

N:该进程以低优先级运行

L:该进程有锁定在内存中的页面。

s:该进程是控制进程。

l:该进程拥有多线程。

+:该进程在前台运行。

可以看出,bash 命令处于休眠状态,但同时它也是一个控制进程(会话中的主进程),而 ps 命令则运行在系统前台。

(3)GNU 长选项

GNU 开发人员在经过改进的新 ps 命令中加入了另外一些选项,其中一些 GNU 长选项复制了现有的 Unix 或 BSD 风格选项的效果,而另外一些则提供了新功能。

作为一个 GNU 长选项,--forest 选项着实讨人喜欢。该选项能够使用 ASCII 字符来绘制可爱的图表以显示进程的层级信息

2.实时监测进程

ps 命令只能显示某个特定时间点的信息。如果想观察那些被频繁换入和换出内存的进程,ps 命令就不太方便了。

与 ps 命令相似,top 命令也可以显示进程信息,但采用的是

实时方式。

输出的第一部分显示的是系统概况:第一行显示了当前时间、系统的运行时长、登录的用户数以及系统的平均负载。

  • 平均负载有 3 个值,分别是最近 1 分钟、最近 5 分钟和最近 15 分钟的平均负载。值越大说明系统的负载越高。由于进程短期的突发性活动,出现最近 1 分钟的高负载值也很常见。但如果近 15 分钟内的平均负载都很高,就说明系统可能有问题了。
  • 第二行显示了进程(top 称其为 task)概况:多少进程处于运行、休眠、停止以及僵化状态(僵化状态指进程已结束,但其父进程没有响应)。
  • 下一行显示了 CPU 概况。top 会根据进程的属主(用户或是系统)和进程的状态(运行、空闲或等待)将 CPU 利用率分成几类输出。
  • 其后的两行详细说明了系统内存的状态。前一行显示了系统的物理内存状态:总共有多少内存、当前用了多少,以及还有多少空闲。后一行显示了系统交换空间(如果分配了的话)的状态。
  • 最后一部分显示了当前处于运行状态的进程的详细列表,有些列跟 ps 命令的输出类似

PID:进程的 PID。

USER:进程属主的用户名。

PR:进程的优先级。

NI:进程的谦让度。

VIRT:进程占用的虚拟内存总量。

RES:进程占用的物理内存总量。

SHR:进程和其他进程共享的内存总量。

S:进程的状态(D 代表可中断的休眠,R 代表运行,S 代表休眠,T 代表被跟踪或停止,Z 代表僵化 )。

%CPU:进程使用的 CPU 时间比例。

%MEM:进程使用的可用物理内存比例。

TIME+:自进程启动到目前为止所占用的 CPU 时间总量。

COMMAND:进程所对应的命令行名称,也就是启动的程序名。

在默认情况下,top 命令在启动时会按照%CPU 值来对进程进行排序,你可以在 top 命令运行时使用多种交互式命令来重新排序。每个交互式命令都是单字符,在 top 命令运行时键入可改变 top 的行为。键入 f 允许你选择用于对输出进行排序的字段,键入 d 允许你修改轮询间隔(polling interval),键入 q 可以退出 top。

3.结束进程

有时候,进程会被挂起,此时只需动动手让进程重新运行或结束就行了。有时候,进程会霸占着 CPU 且拒绝让出。在这两种情景下,都需要能够控制进程的命令。Linux 沿用了 Unix 的进程间通信方法。

在 Linux 中,进程之间通过信号 来通信。进程的信号是预定义好的一个消息,进程能识别该消息并决定忽略还是做出反应。进程如何处理信号是由开发人员通过编程来决定的。

在 Linux 中有两个命令可以向运行中的进程发出进程信号:kill 和 pkill。

(1)kill 命令

kill 命令可以通过 PID 向进程发送信号。在默认情况下,kill 命令会向命令行中列出的所有 PID 发送 TERM 信号。遗憾的是,你只能使用进程的 PID 而不能使用其对应的程序名,这使得 kill 命令有时并不好用。

要发送进程信号,必须是进程的属主或 root 用户

bash 复制代码
#!/bin/bash

# 捕获 TERM 信号并忽略
trap 'echo "捕获到 TERM 信号,但拒绝终止!" ' SIGTERM

echo "进程 PID: $$ 已启动,将忽略 TERM 信号"

# 保持进程运行
while true; do
    sleep 1
done


TERM 信号会告诉进程终止运行。但不服管教的进程通常会忽略这个请求。如果要强制终止,则-s 选项支持指定其他信号(用信号名或信号值)。

要检查 kill 命令是否生效,可以再次执行 ps 命令或 top 命令,看看那些进程是否已经停止运行。

(2)pkill 命令

pkill 命令可以使用程序名代替 PID 来终止进程,这就方便多了。除此之外,pkill 命令也允许使用通配符,当系统出问题时,这是一个非常有用的工具

如 pkill http*

以 root 身份使用 pkill 命令时要格外小心。命令中的通配符很容易意外地将系统的重要进程终止。这可能会导致文件系统损坏。

二、监测磁盘空间

系统管理员的另一项重要任务是监测系统磁盘的使用情况。不管运行的是简单的 Linux 桌面还是大型的 Linux 服务器,你都需要知道还有多少磁盘空间可供应用程序使用。

1.挂载存储设备

Linux 文件系统会将所有的磁盘都并入单个虚拟目录。在使用新的存储设备之前,需要将其放在虚拟目录中。这项工作称为挂载(mounting)

在今天的图形化桌面环境中,大多数 Linux 发行版能自动挂载特定类型的可移动存储设备。如果你使用的发行版不支持自动挂载和卸载可移动存储设备,则只能手动操作了。

(1)mount 命令

用于挂载存储设备的命令叫作 mount。在默认情况下,mount 命令会输出当前系统已挂载的设备列表。但是,除了标准存储设备,较新版本的内核还会挂载大量用作管理目的的虚拟文件系统。这使得 mount 命令的默认输出非常杂乱。

如果知道设备分区使用的文件系统类型,可以像下面这样过滤输出

mount 命令提供了 4 部分信息。

  • 设备文件名
  • 设备在虚拟目录中的挂载点
  • 文件系统类型
  • 已挂载设备的访问状态

要手动在虚拟目录中挂载设备,需要以 root 用户身份登录,或是以 root 用户身份运行 sudo命令。

bash 复制代码
mount -t type device directory

其中,type 参数指定了磁盘格式化所使用的文件系统类型。Linux 可以识别多种文件系统类型。如果与 Windows PC 共用移动存储设备,那么通常需要使用下列文件系统类型。

  • vfat:Windows FAT32 文件系统,支持长文件名。
  • ntfs:Windows NT 及后续操作系统中广泛使用的高级文件系统。
  • exfat:专门为可移动存储设备优化的 Windows 文件系统。
  • iso9660:标准 CD-ROM 和 DVD 文件系统。

我们可以使用虚拟机尝试一下,我这里使用VMware

打开任意一台虚拟机,打开设置

点击添加

选择添加硬盘,点击下一步

系统默认就好



可以找到我们将要挂载的磁盘,将硬盘格式化为vfat类型,再挂载

但此时挂载的硬盘只在这一次开机有效,下一次开机仍需要一次新的挂载。因此我们再进行一步绑定可以让它每次开机都有效

查看硬盘的唯一标识符UUID,修改文件系统表fstab

大多数 U 盘会使用 vfat 文件系统格式化。如果需要挂载数据 CD 或 DVD,则必须使用 iso9660文件系统类型。

mount -t type device directory后面两个参数指定了该存储设备的设备文件位置以及挂载点在虚拟目录中的位置。一旦存储设备被挂载到虚拟目录,root 用户就拥有了对该设备的所有访问权限,而其他用户的访问则会被限制。可以通过目录权限指定用户对设备的访问权限。

-o 选项允许在挂载文件系统时添加一系列以逗号分隔的额外选项。如

  • ro:以只读形式挂载。
  • rw:以读写形式挂载。
  • user:允许普通用户挂载该文件系统。
  • check=none:挂载文件系统时不执行完整性校验。
  • loop:挂载文件。

(2)umount 命令

移除可移动设备时,不能直接将设备拔下,应该先卸载

Linux 不允许直接弹出已挂载的 CD 或 DVD。如果在从光驱中移除 CD 或 DVD 时遇到麻烦,那么最大的可能是它还在虚拟目录中挂载着。应该先卸载,然后再尝试弹出。

bash 复制代码
umount [directory | device ]

umount 命令支持通过设备文件或者挂载点来指定要卸载的设备。如果有任何程序正在使用设备上的文件,则系统将不允许卸载该设备。

卸载完之后,输入上面这样的指令,如果没有输出,则卸载成功;否则卸载失败

因为命令行提示符仍然位于已挂载设备的文件系统中,所以 umount 命令无法卸载该设备。一旦命令提示符移出其文件系统,umount 命令就能成功卸载该设备了。

如果在卸载设备时,系统提示设备繁忙,无法卸载,那么通常是有进程还在访问该设备或使用该设备上的文件。这时可用 lsof 命令获得相关进程的信息,然后将进程终止。lsof命令的用法很简单:lsof /path/to/device/node,或者 lsof /path/to/mount/point。

2.使用 df 命令

有时需要知道在某台设备上还有多少磁盘空间。df 命令可以方便地查看所有已挂载磁盘的使用情况

该命令的输出有

  • 设备文件位置
  • 包含多少以 1024 字节为单位的块
  • 使用了多少以 1024 字节为单位的块
  • 还有多少以 1024 字节为单位的块可用
  • 已用空间所占的百分比
  • 设备挂载点

df 命令的大部分选项你根本不会用到。常用选项之一是-h,该选项会以人类易读(human-readable)的形式显示磁盘空间,通常用 M 来替代兆字节,用 G 来替代吉字节

3.使用 du 命令

通过 df 命令,很容易发现哪个磁盘存储空间不足。系统管理员面临的下一个问题是如何应对这种情况。

du 命令可以显示某个特定目录(默认情况下是当前目录)的磁盘使用情况。这有助于你快速判断系统中是否存在磁盘占用"大户"。

在默认情况下,du 命令会显示当前目录下所有的文件、目录和子目录的磁盘使用情况,并以磁盘块为单位来表明每个文件或目录占用了多大存储空间。

每行最左侧的数字是每个文件或目录所占用的磁盘块数。注意,这个列表是从目录层级的最底部开始,然后沿着其中包含的文件和子目录逐级向上的。

选项能让 du 命令的输出更加清晰易读。

  • -c:显示所有已列出文件的总大小。
  • -h:按人类易读格式输出大小,分别用 K 表示千字节、M 表示兆字节、G 表示吉字节。
  • -s:输出每个参数的汇总信息。

三、处理数据文件

1.数据排序

处理大量数据时的一个常用命令是 sort。在默认情况下,sort 命令会依据会话所指定的默认语言的排序规则来对文本文件中的数据行进行排序

在默认情况下,sort 命令会将数字视为字符并执行标准的字符排序,这种结果可能不是你想要的。可以使用-n 选项来解决这个问题,该选项会告诉 sort 命令将数字按值排序

另一个常用的选项是-M,该选择可以将数字按月排序。

我们会发现失效了,此时输入locale,发现是中文模式,会覆盖掉其原本使用的C语言环境。

我们只需要在输入sort -M之前使用LC_ALL=C即可

2.数据搜索

经常需要在大文件中查找位于文件中间部分某处的数据行。与其手动翻找整个文件,不如使用 grep 命令来帮助查找。

bash 复制代码
grep [options] pattern [file]

rep 命令会在输入或指定文件中逐行搜索匹配指定模式的文本。该命令的输出是包含了匹配模式的行。

如果要进行反向搜索(输出不匹配指定模式的行),可以使用-v 选项

如果要显示匹配指定模式的那些行的行号,可以使用-n 选项

如果只想知道有多少行含有匹配的模式,可以使用-c 选项

如果要指定多个匹配模式,可以使用-e 选项来逐个指定

在默认情况下,grep 命令使用基本的 Unix 风格正则表达式来匹配模式。Unix 风格正则表达式使用特殊字符来定义如何查找匹配模式。

3.数据压缩

gzip 软件包是 GNU 项目的产物,旨在编写一个能够替代原先 Unix 中 compress 工具的免费版本。

这个软件包包括以下文件。

  • gzip:用于压缩文件。
  • gzcat:用于查看压缩过的文本文件的内容。
  • gunzip:用于解压文件。

gzip 命令会压缩命令行中指定的文件。也可以指定多个文件名或是用通配符来一次性压缩多个文件

4.数据归档

目前,Unix 和 Linux 中最流行的归档工具是 tar 命令。tar 命令最开始是用于将文件写入磁带设备以作归档,但它也可以将输出写入文件,这种用法成了在 Linux 中归档数据的普遍做法。

bash 复制代码
tar function [options] object1 object2 ...

function 定义了 tar 命令要执行的操作。每种操作都使用 option(选项)来定义针对 tar 归档文件的具体行为。

该命令创建了一个名为 testdir.tar 的归档文件,包含目录 test 和 test2 的内容。

该命令列出了(但不提取)tar 文件 test.tar 的内容。

该命令从 tar 文件 test.tar 中提取内容。

相关推荐
琪琪花1 分钟前
sshfs 将远程服务器上的文件系统挂载到本地目录
linux·运维·服务器
dreamczf20 分钟前
基于Linux系统的边缘智能终端(RK3568+EtherCAT+PCIe+4G+5G)
linux·人工智能·物联网·5g
wayuncn27 分钟前
哈尔滨服务器租用的流程
运维·服务器
钡铼技术物联网关42 分钟前
导轨式ARM工业控制器:组态软件平台的“神经中枢”
linux·数据库·人工智能·安全·智慧城市
Moonnnn.1 小时前
51单片机——程序执行过程(手工汇编)
汇编·笔记·嵌入式硬件·学习·51单片机
zyhhsss1 小时前
大模型应用开发学习笔记
笔记
恋恋西风1 小时前
VTK笔记- 3D Widget类 vtkSplineWidget 样条部件
笔记
blasit2 小时前
keil 5 MDK 安装失败提示Cannot create destination file."文件名、目录名或卷标语法不正确"
运维·程序员·如何当个好爸爸
fanxiaohui121382 小时前
元脑服务器的创新应用:浪潮信息引领AI计算新时代
运维·服务器·人工智能
若云止水3 小时前
Ubuntu 下 nginx-1.24.0 源码分析 - cycle->modules[i]->ctx
linux·nginx·ubuntu