Linux 下有非常多的命令,我们可以通过这些命令在 Shell 环境下与机器进行交互,那么 Linux 下有多少资源可以供我们调度呢?其实是非常多的,但所有资源都可以分为三大类型。
文件:Everything is file;
进程:文件的运行形态;
网络:特殊的文件。
文件
文件也可以理解为数据,在 Linux 环境下有一个很基本的设计原则,即 Everything is file,所有的内容都是以文件的形式来进行抽象的,比如:进程、网络、硬件等,都可以抽象成文件,可以对其进行打开、读取、写入等操作,所以文件便是我们入门的第一个知识点,文件又可以分为这样几类常见的命令。
(1)磁盘与目录
通过 df 或 df-h 命令,打印设备上挂载了多少个磁盘设备,以及磁盘里还有多少可用空间。
ls 可以打印当前目录下的所有文件和目录,你可以通过 ls 命令,把当前所有的目录和文件都打印出来了
ls 有一个常用的参数叫 -l,-l 可以打印出每个文件的基本信息,比如第一个文件,这里打印出了它的文件权限 -rw-r--r--、文件归属 root、文件大小,以及何时被创建等信息。ls-l 在我们的日常工作中使用频率比较高。
cd 命令进入某个目录,进入目录后,通过 ls 查看目录下所有文件
使用 ls、cd 命令可以让我们在不同目录之间进行切换,切换之后还可以通过 pwd 命令获取当前目录所在的路径。
(2)文件编辑
我们可以使用三种方法阅读文件:
cat,它可以阅读文件并查找文件内容,但缺点就是一页的内容非常长;
more,可以实现翻页阅读,缺点就是不够灵活;
less,它既可以实现上下滑动,还可以实现左右移动,可以实现交互式阅读,是三种阅读方法中最强大的。
只能阅读文件是不能够满足需求的,我们需要有对文件有进行编辑的能力。我们可以通过 vi 或 vim 实现这样的能力,vi 是最早的一个编辑器,vim 是后期的一个变种,在很多系统上 vi 与 vim 是等价的。比如 vi README.md,打开之后你会发现有光标,可以随意移动,也可以对内容进行修改。关于 vi 中的一些常用快捷键课后你可以自己搜索掌握。阅读完文件后通过 :q 进行退出,还有一个流式修改命令 sed
(3)文件权限
我们看到文件权限中有三组内容,第一组内容(rw)表示该文件在当前用户下的权限,第二组内容(r)表示在同组下的权限,第三组内容(r)表示不在同组下其他方的权限。而 r 表示可读,w 表示可写,x 表示文件可执行。
可以通过 chmod 命令修改一个文件的权限,也可以通过 chown 修改一个文件所归属的用户或组
如果你不了解 Linux 某些命令的用法,就可以通过 man 来查看使用方法。
关于文件,你还可以通过 find 命令搜索当前的目录并列出所有文件,也可以通过 find + name 的方式查找具体文件。
进程
进程是一个文件的运行形态。如果一个文件是可执行文件,比如setup.go,系统就可以通过 CPU 去调度它,通过解析器完成相应的操作。那我们如何知道到底有多少文件是可以被调度的呢?
通过 ls-l 查看所有文件权限,通过权限位 x,可以看到哪些文件是可以执行的或该文件下有哪些文件是可以执行的,所以权限位 x 并不完全准确。比如 某些文件,即使没有权限位 x,也可以通过解析器来运行它。
那么用什么命令可以查看当前有多少个进程呢?通常我们使用 top 或 ps 命令查看当前进程。
(1)ps
列举当前用户下的所执行的命令
sleep 3,它可以让当前进程窗口休眠 3 秒钟,你可以看到它是一个非常典型的进程。
Linux 下有一个基本的设计原则就是 Everything is file,所以这里的 sleep 也是一个文件,我们可以通过 which 命令(which sleep)查看它所在的目录,当我们需要调度它的时候,就可以通过路径或名字直接调度它。
输入 sleep 300 命令后运行,然后我们打开一个新的窗口,并登录服务器,然后使用 ps 查看到当前的进程。
如果我们想要找到当前执行的 sleep 300 这个命令,可以通过 ps-ef 列举出所有的进程,你可以看到刚才所写的 sleep 300 命令,系统对它进行了调度,并最终形成了一个进程。
我们可以通过 ps -ef | less 命令查看一个进程的状态,| 符号是一个管道,这里先记住怎么用,后面的课时会进行详细讲解,你可以看到用户的 UID,进程的 PID,父进程的PPID,以及进程开始的时间,运行参数等信息。
(2)top
当执行 top后,我们可以看到动态的交互界面上显示了整个机器的一个状态,包括了负载情况,当前用户,启动时间,相关的任务树,以及内存,进程的一些数据等,同样也包含 PID、USER、内存、共享内存,CPU 占比等全部信息。还可以对进程进行排序和查询,所以top 是一个非常实用的查看进程的命令,如果某台机器出现问题时,第一个输入的命令通常就是 top,查看哪个进程内存、CPU 占比高来排查问题原因。
如果你想真正了解 Linux,了解 Shell,那么推荐你把 ps 和 top 的帮助文档直接打印出来,全部看一遍。
网络
当一个文件加载到 CPU 中被执行的过程中它就变成了一个进程,有的时候进程之间需要通信,这个时候就会开启一个 socket,socket 就是对外建立连接的一个窗口,然后借助 TCP 协议进行通信。但进行通信之前首先需要进程开启一个端口,那我们如何查看本地开启了多少端口?这些端口又是由哪些进程开启的呢?
(1)netstat -tlnp 命令查看 TCP 协议进程端口,-t 指的是 TCP 协议,-l (listen)指哪几个进程开启了对外的链接,负责监听端口,-n 指不需要解析远程服务器的名字,以加快运行速度,-p 指打印进程,我们看下执行效果,可以看到当前机器的第一条端口信息开放了 22 端口,这时我就可以通过 ssh 登录这个服务器,如果系统没有开放任何端口,外部是无法进行任何操作的,也就是此时机器对外是完全封闭的。
(2)netstat -tnp
通过 netstat -tnp 获取了本地机器上有多少个链接正在与外部进行通信,属于哪个进程你也可以看到,比如这条是阿里云上的性能监控的一个服务,它链接了某个远程的 IP。
还有个需要你注意的点,Mac 系统与 Linux系统并不完全一致,因为历史原因,它们两个的参数并不一致,比如 Mac 系统中,要实现与 netstat -tlnp 相同的效果你需要使用不同的语法 netstat -p tcp -n -a,它也可以列举出当前开放的端口情况。
关于进程你可以通过 ps 或 top 命令进行获取。进程需要对外进行通信时,首先需要开启端口,你可以通过 netstat 进行查询。很多公司在面试时,都会提问关于进程、网络、文件相关的知识点