本课主要从文件、进程、网络三个方面讲解Linux常用命令知识。我们知道Linux下有很多命令,我们可以通过这些命令在Shell环境下与机器进行交互,那么Linux下我们可以调度多少资源呢?其实有很多,但是所有的资源都可以分为三类。文件:一切都是文件;process:文件的运行形式;网络:特殊文件。文件首先,让我们看一下文件。文件也可以理解为数据。在Linux环境下,有一个非常基本的设计原则,就是Everythingisfile。所有的内容都以文件的形式抽象出来,比如:进程、网络、硬件等,都可以抽象成文件,可以打开、读取、写入等,所以文件是我们的第一个知识点上手,和文件可以分为几类常用命令。第一种磁盘和目录,磁盘和目录,我们可以使用df或者df-h命令打印出设备上挂载了多少个磁盘设备,磁盘还有多少空闲空间。比如我的机器总容量是40G,已经用了34G,利用率达到了91%。第二个命令称为ls。ls可以打印出当前目录下的所有文件和目录。您可以使用ls命令打印所有当前目录和文件。ls有一个常用的参数叫-l,-l可以打印出每个文件的基本信息,比如第一个文件,这里打印它的文件权限-rw-r--r--,该文件属于root,文件的大小,以及创建时间等信息。ls-l是我们日常工作中经常用到的。那么如果我们想进入移动电源分析专用工具battery-historian的子目录,应该怎么办呢?可以通过cd命令进入battery-historian目录。进入目录后,使用ls查看目录下的所有文件。使用ls和cd命令允许我们在不同的目录之间切换。切换之后,我们还可以使用pwd命令获取当前目录的路径。文件编辑以上是一些常用的磁盘和目录切换、读取、获取信息的命令。接下来,我们输入一个文件并编辑该文件。我们通过ls-l得到文件列表后,就可以看到README.md文件了。在文件列表中,有些文件权限以d开头表示该文件是目录,没有d表示是文件。接下来我们进入README.md,看看README.md里有什么?我们可以使用三种方式来读取文件:cat,可以读取文件,找到文件的内容,但是缺点是一个页面的内容很长;more,可以实现翻页阅读,缺点是不够灵活;less,既可以实现上下滑动,也可以实现左右移动和互动阅读,是三种阅读方式中最强大的。但是往往仅仅读取文件是不能满足需求的,我们需要具备编辑文件的能力。我们可以通过vi或vim来实现这种能力。vi是最早的编辑器,vim是后来的变体。vi和vim在许多系统上是等效的。比如viREADME.md,打开后会发现一个光标,可以自由移动,也可以修改内容。课后可以搜索并掌握vi中一些常用的快捷键。读取文件后通过:q退出,还有一个流式修改命令sed,我将在下一课《Linux三剑客》中重点介绍。文件权限虽然我们已经掌握了如何编辑文件,但是在编辑文件之前,我们仍然需要对文件权限进行管理。那么如何管理一个文件的权限呢?我们通过ls-l进入文件目录,还是以README.md文件为例,它的权限是什么?我们看到文件权限中有三组内容。第一组内容(rw)表示当前用户下的文件权限,第二组内容(r)表示同组权限,第三组内容(r)表示其他方权限不在同一组。而r表示可读,w表示可写,x表示文件可执行。可以通过chmod命令修改文件的权限,也可以通过chown命令修改文件所属的用户或组。这里需要注意的是ls-l可以查看文件权限。我们以README.md为例。该文件对当前用户可读可写,但对其他用户不可写。那么,如果我们现在不想让任何用户看到该文件怎么办?可以通过chmodo-rreadme.md命令修改权限。重新进入该文件的权限后,发现第三组权限没有状态,即其他用户看不到该文件。chmod命令的更多用法,可以在Linux下通过man查看其命令帮助,可以看到该命令的属性、参数和具体说明。如果你不知道如何使用Linux中的某些命令,你可以使用man查看它们的使用方法。对于文件,也可以使用find命令搜索当前目录并列出所有文件,也可以使用find+name查找具体文件。对于特殊的文件,比如软链接、socket、管道等,课后可以自行搜索知识,这里就不详细介绍了。进程第二个方面是进程,是一个文件的运行状态。如果一个文件是可执行文件,比如setup.go,系统可以通过CPU对其进行调度,通过解析器完成相应的操作。那么我们怎么知道可以调度多少个文件呢?通过ls-l查看所有文件权限,通过权限位x可以看出哪些文件是可执行的或者这个文件下有哪些文件是可执行的,所以权限位x并不完全准确。例如,即使没有权限位x,setup.go也可以通过解析器运行。那么可以使用什么命令来查看当前有多少个进程呢?通常我们使用top或者ps命令来查看当前进程。ps先学简单的ps,使用ps会列出当前用户执行的命令。接下来再输入一个命令sleep,比如sleep3,会让当前进程窗口休眠3秒,可以看到是一个很典型的进程。上课一开始我们就说过Linux下有一个基本的设计原则就是Everythingisfile,所以这里的sleep也是一个文件。我们可以使用which命令查看它所在的目录。当我们需要调度的时候,可以通过路径或者名称直接调度。输入sleep300命令后运行,然后我们新开一个窗口,登录服务器,用ps查看当前进程。如果我们想找到当前执行的sleep300命令,我们可以通过ps-ef列出所有的进程,可以看到刚才写的sleep300命令,系统调度它,最终形成一个进程。我们可以使用ps-ef|less命令查看进程状态。|符号是一个管道。在这里,记住如何使用它。我们将在后面的课程中详细解释。可以看到用户的UID、进程的PID、父进程的PPID,以及进程启动时间、运行参数等信息。topps是获取当前进程列表的重要命令。接下来,我们将学习另一个命令top。执行top后,我们可以看到动态交互界面显示了一个整机的状态,包括负载情况,当前用户,启动时间,相关任务树,还有内存,进程的一些数据等等,也包括了所有的信息比如PID,USER,memory,sharedmemory,CPUratio等等。还可以对进程进行排序查询,所以top是一个非常实用的查看进程的命令。如果某台机器出现问题,输入的第一个命令通常是top,查看哪个进程内存和CPU占用率高。问题原因。以前在阿里巴巴的时候,导师就建议我,“如果你想真正了解Linux和Shell,那我建议你直接把ps和top的帮助文档打印出来,全部看一遍”。你长了很多知识,所以我也建议你把ps和top的帮助文档也打印出来,全部看一遍。网络最后,让我们了解一下网络。当一个文件被加载到CPU并执行时,它就变成了一个进程。有时进程需要通信。这时候会打开一个socket,这个socket就是为了与外界建立连接。一个窗口,然后用TCP协议进行通信。但是在通信之前,进程需要先打开一个端口,那么我们如何查看本地打开了多少个端口呢?这些端口是由哪些进程打开的?netstst-tlnp我们可以通过netstst-tlnp命令查看TCP协议进程端口,-t指的是TCP协议,-l(listen)指的是哪些进程开启了外链,负责监听端口,-n指的是不解析远程服务器的名字来加速运行,-p指的是打印过程,我们看执行效果,可以看到当前机器的第一个端口信息已经打开了22端口,那么我可以通过ssh登录到这个服务器,如果系统没有开放任何端口,外部也不能进行任何操作,也就是此时机器完全不对外开放。第二个端口信息开启25端口,监听127.0.0.1。被监控的端口无法从外部访问,仅用于本地进程之间的通信。netstst-tnpl是listen,就是监听的意思。它可以列出当前机器上有多少进程正在与外界通信。如果我们删除l并直接使用netstat-tnp命令会发生什么情况?我们看第一条消息,它首先访问了远程服务器的80端口,再看第二条消息,本地进程正在访问邮件服务,第三条消息是建立本地和远程3128之间的链接。通过netstat-tnp,可以得到本机有多少个链接在和外界通信,可以看到它们属于哪个进程。比如这是阿里云上的一个性能监控服务,它链接的是一个远程IP。还有一点需要大家注意。Mac系统与Linux系统并不完全相同。由于历史原因,两者的参数并不一致。比如在Mac系统中,要达到和netstst-tlnp一样的效果,需要使用不同的Syntaxnetstat-ptcp-n-a,它也可以列出当前开放的端口。关于进程,可以通过ps或者top命令获取。当一个进程需要与外界通信时,首先需要打开端口,可以通过netstat查询。在面试的时候,很多公司都会问流程、网络、文件相关的问题。
