完成了Linux环境搭建、远程连接配置和基础命令学习之后我终于进入了系统管理层面。如果说之前学的是怎么在Linux里走路那现在要学的就是怎么知道系统在干什么、怎么让它干得更好。课程推进到了更多的bash shell命令这一章内容涵盖了进程管理、磁盘挂载与空间查看、数据排序与检索、文件压缩归档等。这些命令在日常开发和运维中几乎是天天要用到的掌握它们意味着从会用Linux向管好Linux迈出了关键一步。这篇文章就是我完整的实践记录包含命令用法、实操截图和踩坑心得希望能给同样在进阶路上的同学一些参考。当程序运行在系统上时我们称之为进程。想监测这些进程首先需要熟悉ps命令的用法。ps命令能输出运行在系统上的所有程序的许多信息。最基本的用法就是在终端里直接敲ps但这时候只显示了当前终端会话中运行的进程比如bash shell本身和刚执行的ps命令自己信息非常有限。真正有用的是带参数的版本。我用的第一个组合是ps -ef-e参数指定显示所有运行在系统上的进程-f参数则扩展了输出列包含了更丰富的信息。输出依次包含UID启动进程的用户、PID进程ID、PPID父进程ID如果该进程是由另一个进程启动的、C进程生命周期中的CPU利用率、STIME进程启动时的系统时间、TTY进程启动时的终端设备、TIME运行进程需要的累计CPU时间和CMD启动的程序名称。这个命令的输出会非常长我通常配合grep来过滤特定的进程比如ps -ef | grep sshd就能只查看与sshd相关的进程。除了-ef我还试了ps aux这个组合它显示的内容和-ef类似但列名稍有不同提供了更多关于内存使用和CPU占比的信息在实际使用中这两个组合各有适用场景。ps命令虽然有用但它只能显示某个特定时间点的信息。当我需要持续观察系统的动态变化时top命令就派上用场了。在终端里敲top它会启动一个全屏的交互界面信息会持续刷新。输出的第一部分显示的是系统概况。第一行显示了当前时间、系统运行时间、登录用户数以及系统的平均负载平均负载有三个值分别是最近1分钟、最近5分钟和最近15分钟的平均负载值越大说明系统负载越高由于进程短期的突发性活动出现最近1分钟的高负载值也很常见但如果近15分钟内的平均负载都很高就说明系统可能有问题。第二行显示了进程概要信息top把进程叫作任务这里会显示有多少进程处在运行、休眠、停止或是僵化状态僵化状态是指进程完成了但父进程没有响应这种进程虽然不再消耗CPU资源但会占用进程表条目如果堆积太多需要处理。第三行显示了CPU的概要信息top根据进程的属主用户还是系统和进程状态运行、空闲还是等待将CPU利用率分成几类输出包括us用户空间、sy内核空间、ni低优先级用户、id空闲、wa等待IO、hi硬件中断、si软件中断等。最后两行说明了系统内存的状态Mem行显示物理内存的总量、已用量和空闲量Swap行显示交换空间的状态。在top界面中我试了几个交互操作。按下大写E内存显示的单位会在KB、MB、GB之间循环切换这对于查看大内存机器非常方便。按下u键后top会提示输入用户名输入后界面只显示该用户的所有进程在排查某个用户的资源占用问题时特别有用。按下q键即可退出top。我还试了-u参数直接在启动时就指定用户过滤比如top -u root直接查看root用户的进程。作为系统管理员很重要的一个技能就是知道何时以及如何结束一个进程。有时进程挂起了只需要动动手让进程重新运行或结束就行了但有时有的进程会耗尽CPU且不释放资源这时候就需要能控制进程的命令。kill命令通过进程ID给进程发信号。默认情况下kill命令会向命令行中列出的全部PID发送一个TERM信号TERM信号告诉进程可能的话就停止运行这是一种礼貌的终止方式进程可以捕获这个信号并做一些清理工作再退出。用法格式是kill [option] [PID号]。如果遇到进程无法正常结束的情况可以添加-9参数发送KILL信号这个信号强制内核立即终止该进程进程无法捕获或忽略。但这个命令需要慎用因为它不给进程任何善后机会可能导致数据丢失或资源泄漏。实际工作中我会先尝试不带参数的kill如果没反应再用-9。实操中我做了个小实验在后台启动一个sleep 1000进程然后用ps -ef | grep sleep找到它的PID先用kill PID尝试终止再用ps确认进程是否还在对于某些模拟的顽固进程我用了kill -9 PID来强制结束。搞清楚了进程管理接下来进入磁盘管理部分。Linux文件系统将所有的磁盘都并入一个虚拟目录下在使用新的存储媒体如外接硬盘、U盘等之前需要把它放到虚拟目录下这项工作称为挂载。Linux上用来挂载媒体的命令是mount。默认情况下mount命令会输出当前系统上挂载的设备列表输出提供了四部分信息媒体的设备文件名、媒体挂载到虚拟目录的挂载点、文件系统类型、以及已挂载媒体的访问状态如rw表示可读写。要手动在虚拟目录中挂载设备需要以root用户身份登录或使用sudo命令。手动挂载媒体设备的基本命令是sudo mount -t vfat /dev/sdb1 /mnt/usb其中-t参数指定了磁盘被格式化的文件系统类型如vfat、ext4、ntfs等后面两个参数定义了存储设备的设备文件位置以及挂载点在虚拟目录中的位置。从Linux系统上移除一个可移动设备时不能直接从系统上拔掉而应该先卸载命令是sudo umount /mnt/usb。这里要特别注意如果有任何程序正在使用设备上的文件系统将不允许卸载设备。如果在卸载设备时系统提示设备繁忙通常是有进程还在访问该设备或使用设备上的文件。这时可用lsof命令获得使用它的进程信息比如lsof /mnt/usb输出会显示进程名、进程ID、所属用户、文件描述符、文件类型、设备ID、进程大小、文件Inode号、路径或链接。找到占用进程后可以终止该进程或让其停止使用该设备然后再尝试卸载。查看磁盘空间方面df命令可以方便地查看所有已挂载磁盘的使用情况。df的输出依次为设备的设备文件位置、能容纳多少个1024字节大小的块、已用了多少个块、还有多少个块可用、已用空间所占比例、设备挂载到了哪个挂载点上。为了让输出更直观我强烈推荐加上-h参数df -h会把输出中的磁盘空间按照用户易读的形式显示通常用M替代兆字节用G替代吉字节这样一眼就能看到哪个分区快满了。df命令很容易发现哪个磁盘的存储空间快没了但发生这种情况时要怎么办du命令可以显示某个特定目录默认当前目录的磁盘使用情况用来快速判断系统上哪个目录下有超大文件。默认情况下du命令会显示当前目录下所有的文件、目录和子目录的磁盘使用情况以磁盘块为单位来表明每个文件或目录的占用量对标准大小的目录来说这个输出会是一个比较长的列表。为了让du命令用起来更方便我用了这几个参数du -h以人类可读格式显示大小du -sh只显示当前目录的总大小du -ch显示所有列出的文件或目录的总大小汇总并在最后输出一个总和行du -h --max-depth1限制显示的深度只看第一层子目录。这些组合起来可以快速定位大目录。系统命令很容易输出过量的信息Linux提供了一些命令行工具来处理大量数据。首先是sort命令它是对数据内容进行排序一定要掌握。需要注意的是sort只是将数据在显示的时候进行了排序实际上文件内部的数据并没有改变。我创建了一个测试文件来尝试各种参数文件里包含了5、23、100、8、45、3、67、12、89、34这些数字。默认情况下sort命令会把数字当作一个个字符来执行标准的字符排序结果100排在了12前面因为字符1小于2这正是字符排序的特征。用-n参数后sort命令把数字识别成数字而不是字符并且按数值大小排序这样3、5、8、12、23、34、45、67、89、100就按正确的数值顺序排列了。用-r参数则可以将结果按降序输出。如果需要对多列数据按指定列排序可以用-k参数指定列号比如有一个包含姓名 年龄 成绩三列的数据文件想按年龄排序就用sort -k2 -n students.txt。然后是grep命令它会在输入或指定的文件中查找包含匹配指定模式的字符的行grep的输出就是包含了匹配模式的行一定要掌握。我创建了一个测试文件内容包含apple、banana、apple pie、grape、orange、Apple、APPLE、pineapple这些词。基础搜索是grep apple test.txt它区分大小写只匹配小写的apple。加上-i参数后忽略大小写Apple和APPLE也会被匹配到。加上-v参数进行反向搜索输出不匹配该模式的行。加上-n参数会显示匹配模式的行所在的行号。加上-c参数则只统计有多少行含有匹配的模式而不输出具体内容。加上-e参数可以指定多个匹配模式比如grep -e apple -e grape就能同时匹配apple和grape。grep的真正威力在于支持正则表达式比如grep ^a test.txt能匹配所有以字母a开头的行。最后是压缩和归档工具。gzip命令会压缩你在命令行指定的文件也可以在命令行指定多个文件名甚至用通配符来一次性批量压缩文件。gzip largefile.txt会生成largefile.txt.gz并替换原文件解压时用gzip -d largefile.txt.gz或者gunzip largefile.txt.gz。tar命令最开始是用来将文件写到磁带设备上归档的但现在在Linux上已经普遍用来归档数据了。下载开源软件或数据文件之后经常会看到以.gz或者.tar.gz结尾的压缩文件最常用的两种解压命令是tar -zxvf filename.tar.gz和gzip -d filename.gz。tar的几个典型用法我也都试了一遍tar -cvf usr.tar /home把home目录备份为usr.tartar -czvf usr.tar.gz /home在备份的同时进行压缩tar -xzvf usr.tar.gz把压缩包还原解压tar -tvf usr.tar | more分屏查看备份文件的内容。整个实践过程中遇到了几个值得记录的问题。第一个是在虚拟机中ps -ef输出太多终端直接滚动了几百行根本找不到自己想要的进程后来学会了用管道配合grep来过滤一下子就定位到了目标。第二个是在测试kill -9的时候不小心用ps -ef | grep test输出中的PID去杀了一个系统进程还好那个进程不是关键服务不然可能导致系统异常从此以后我每次kill之前都会仔细确认PID对应的进程名称。第三个是使用du命令时默认输出是以KB为单位的数字一大串数字看着非常费劲加上-h参数后直接显示为1.2G、345M这样的格式可读性提升了不止一个档次。第四个是sort默认按字符排序的特性一开始让我很困惑为什么100会排在3前面后来认真看了文档才明白字符排序和数值排序的区别-n参数从此成了我的必加项。第五个是用grep搜索时没加-i导致漏掉了大写形式的结果排查了半天还以为数据有问题这也提醒我在做文本搜索时要根据实际情况考虑是否忽略大小写。回过头来看进程管理这块有ps用来查看进程快照、top用来实时监控系统状态、kill用来终止进程磁盘管理这块有mount和umount用来挂载和卸载设备、df和du用来查看磁盘和目录的空间使用情况数据处理这块有sort用来排序数据、grep用来搜索文本模式、gzip和tar用来压缩和解压归档文件。这些命令覆盖了日常Linux系统管理中最核心的操作场景从判断系统状态到控制进程从挂载新磁盘到查看存储空间从排序数据到检索特定信息再到压缩和解压大型文件基本上已经构成了一个完整的工具箱。虽然Linux的学习之路还很长但每往前走一步视野就开阔一点。这些命令我打算在后续的实践中反复使用让它们真正成为肌肉记忆。希望我记录的这些命令用法和踩坑过程能给同样在进阶阶段的同学一些帮助如果有哪里写得不准确或者有更好的操作方式也欢迎一起来讨论共同进步。