linux相关命令

记录一些相对不太熟悉的命令和需要注意的知识。

https://cyc2018.github.io/CS-Notes/

命令

文件相关

cat : cat 命令用于连接文件并打印到标准输出设备上。(-n: 打印出行号,连同空白号;-b:打印行号,无空白行)

tac:cat 的反向操作,从最后一行开始打印。

more:和 cat 不同的是它可以一页一页查看文件内容,比较适合大文件的查看。

less:和 more 类似,但是多了一个向前翻页的功能。

head:取得文件前几行(-n); tail:head的反向操作,后几行。

od:以字符或者16进制的形式显示二进制文件。

grep:使用正则表达式进行全局查找并打印**。搜索指定文件的内容,匹配指定的模式,默认情况下输出匹配内容所在的行。grep 只支持匹配而不能替换匹配到的内容。

touch:更新文件时间或建立新文件

指令与文件搜索

man:man 是 manual 的缩写,将指令的具体信息显示出来。

info:info 与 man 类似,但是 info 将文档分成一个个页面,每个页面可以跳转。

which:指令搜索。

which [-a] command

-a : 将所有指令列出,而不是只列第一个

whereis:文件搜索。速度比较快,因为它只搜索几个特定的目录。

locate:文件搜索。可以用关键字或者正则表达式进行搜索。无法用 locate 搜索新建的文件,可以使用 updatedb 来立即更新数据库。

find:文件搜索。可以使用文件的属性和权限进行搜索。

find [basedir] [option] 有许多的选项,时间、文件拥有者、文件权限和名称。

find . -name “shadow*”

其他

cut:用于显示每行从开头算起 num1 到 num2 的文字。对数据进行切分,取出想要的部分。

sort:用于排序。

who:在关机前需要先使用 who 命令查看有没有其它用户在线。

sync:为了加快对磁盘文件的读写速度,位于内存中的文件数据不会立即同步到磁盘,因此关机之前需要先进行 sync 同步操作。

shutdown:关机。

chmod:修改权限。

chmod [-R] xyz dirname/filename 此时一组权限的 3 个位当做二进制数字的位,从左到右每个位的权值为 4、2、1,即每个权限对应的数字权值为 r : 4、w : 2、x : 1。如chmod 754 .bashrc

uniq:可以将重复的数据只取一个。

双向输出重定向 tee:输出重定向会将输出内容重定向到文件中,而 tee 不仅能够完成这个功能,还能保留屏幕上的输出。也就是说,使用 tee 指令,一个输出会同时传送到文件和屏幕上。$ tee [-a] file

split:将一个文件划分为多个文件

文件系统

对分区进行格式化是为了在分区上建立文件系统。一个分区通常只能格式化为一个文件系统,但是磁盘阵列等技术可以将一个分区格式化为多个文件系统。

组成

最主要的组成部分:

  • inode:一个文件占用一个 inode,记录文件的属性,同时记录此文件的内容所在的 block 编号;
  • block:记录文件的内容,文件太大时,会占用多个 block。

除此之外还有:

  • superblock:记录文件系统的整体信息,包括 inode 和 block 的总量、使用量、剩余量,以及文件系统的格式与相关信息等;
  • block bitmap:记录 block 是否被使用的位图。

文件读取

对于Ext2文件系统,当要读取一个文件的内容时,先在 inode 中查找文件内容所在的所有 block,然后把所有 block 的内容读出来。

对于FAT文件系统,没有 inode,每个 block 中存储着下一个 block 的编号。

磁盘碎片

指一个文件内容所在的 block 过于分散,导致磁盘磁头移动距离过大,从而降低磁盘读写性能。

inode

inode具体包含以下信息:

  • 权限(read/write/execute)
  • 拥有者与群组
  • 容量
  • 建立或状态改变的时间(ctime)
  • 最近读取时间(atime)
  • 最近修改时间(mtime)
  • 定义文件特性的旗标(flag),如SetUID…
  • 该文件真正内容的指向(pointer)

inode中记录了文件内容所在的 block 编号,但是每个 block 非常小,而一个文件可能需要几十万的block。一个 inode 大小有限,无法直接引用这么多 block 编号。因此引入了间接、双间接、三间接引用。间接引用让 inode 记录的引用 block 块记录引用信息。

目录

建立一个目录时,会分配一个 inode 与至少一个 block。block 记录的内容是目录下所有文件的 inode 编号以及文件名

目录配置

为了使不同 Linux 发行版本的目录结构保持一致性,Filesystem Hierarchy Standard (FHS) 规定了 Linux 的目录结构。最基础的三个目录如下:

  • /(root,根目录)
  • /usr(unix softmax resource 所有系统默认软件都会安装到这个目录)
  • /var(variable 存放系统或程序运行过程中的数据文件)

文件属性

使用 ll 查看一个文件时,会显示一个文件的信息,例如 drwxr-xr-x 3 root root 17 May 6 00:14 .config,对这个信息的解释如下:

  • drwxr-xr-x:文件类型以及权限,第 1 位为文件类型字段,后 9 位为文件权限字段。用户分为三种:文件拥有者、群组以及其它人,对不同的用户有不同的文件权限。后9位分别对应这三种用户。
  • 3:链接数
  • root:文件拥有者
  • root:所属群组
  • 17:文件大小
  • May 6 00:14:文件最后被修改的时间
  • .config:文件名

常见的文件类型及其含义有:

  • d:目录
  • -:文件
  • l:链接文件

默认权限

  • 文件默认权限:文件默认没有可执行权限,因此为 666,也就是 -rw-rw-rw- 。
  • 目录默认权限:目录必须要能够进入,也就是必须拥有可执行权限,因此为 777 ,也就是 drwxrwxrwx。

链接

img

ln [-sf] source_filename dist_filename

-s:默认是实体链接,加-s为符号链接

-f:如果目标文件存在时,先删除目标文件

实体链接

在目录下创建一个条目,记录着文件名与 inode 编号,这个 inode 就是源文件的 inode。删除任意一个条目,文件还是存在,只要引用数量不为 0。有以下限制:不能跨越文件系统、不能对目录进行链接。

符号链接

符号链接文件保存着源文件所在的绝对路径,在读取时会定位到源文件上,可以理解为 Windows 的快捷方式。当源文件被删除了,链接文件就打不开了。可以为目录建立符号链接。

Bash

可以通过 Shell 请求内核提供服务,Bash 正是 Shell 的一种。

特性

  • 命令历史:记录使用过的命令
  • 命令与文件补全:快捷键:tab
  • 命名别名:例如 ll 是 ls -al 的别名
  • shell scripts
  • 通配符:例如 ls -l /usr/bin/X* 列出 /usr/bin 下面所有以 X 开头的文件

变量操作

对一个变量赋值直接使用=。对变量取用需要在变量前加上 $ ,也可以用 ${} 的形式;

可以使用 export 命令将自定义变量转成环境变量,环境变量可以在子程序中使用,所谓子程序就是由当前 Bash 而产生的子 Bash。

指令搜索顺序

  • 以绝对或相对路径来执行指令,例如 /bin/ls 或者 ./ls ;
  • 由别名找到该指令来执行;
  • 由 Bash 内置的指令来执行;
  • 按 $PATH 变量指定的搜索路径的顺序找到第一个指令来执行。

管道指令

管道是将一个命令的标准输出作为另一个命令的标准输入,在数据需要经过多个步骤的处理之后才能得到我们想要的内容时就可以使用管道。

进程管理

ps:查看某个时间点的进程信息。

pstree:查看进程树。

top:实时显示进程信息。

netstat:查看占用端口的进程。

SIGCHLD

当一个子进程改变了它的状态时(停止运行,继续运行或者退出),有两件事会发生在父进程中:

  • 得到SIGCHLD信号;
  • waitpid() 或者 wait() 调用会返回。

其中子进程发送的 SIGCHLD 信号包含了子进程的信息,比如进程 ID、进程状态、进程使用 CPU 的时间等。在子进程退出时,它的进程描述符不会立即释放,这是为了让父进程得到子进程信息,父进程通过 wait() 和 waitpid() 来获得一个已经退出的子进程的信息。

孤儿进程

一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程将被 init 进程(进程号为 1)所收养,并由 init 进程对它们完成状态收集工作。由于孤儿进程会被 init 进程收养,所以孤儿进程不会对系统造成危害。

僵尸进程

一个子进程的进程描述符在子进程退出时不会释放,只有当父进程通过 wait() 或 waitpid() 获取了子进程信息后才会释放。如果子进程退出,而父进程并没有调用 wait() 或 waitpid(),那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵尸进程。

系统所能使用的进程号是有限的,如果产生大量僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程。

要消灭系统中大量的僵尸进程,只需要将其父进程杀死,此时僵尸进程就会变成孤儿进程,从而被 init 进程所收养,这样 init 进程就会释放所有的僵尸进程所占有的资源,从而结束僵尸进程。

其他

PATH:可以在环境变量 PATH 中声明可执行文件的路径,路径之间用 : 分隔。

sudo:允许一般用户使用 root 可执行的命令,不过只有在 /etc/sudoers 配置文件中添加的用户才能使用该指令。

vim三个模式:

img

  • 一般指令模式(Command mode):VIM 的默认模式,可以用于移动游标查看内容;
  • 编辑模式(Insert mode):按下 “i” 等按键之后进入,可以对文本进行编辑;
  • 指令列模式(Bottom-line mode):按下 “:” 按键之后进入,用于保存退出等操作。

BIOS:基本输入输出系统。它是一个固件(嵌入在硬件中的软件),BIOS 程序存放在断电后内容不会丢失的只读内存中。BIOS 是开机的时候计算机执行的第一个程序,这个程序知道可以开机的磁盘,并读取磁盘第一个扇区的主要开机记录(MBR),由主要开机记录(MBR)执行其中的开机管理程序,这个开机管理程序会加载操作系统的核心文件。