Linux

基本概念及操作

求助

man

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

man date
代号 类型
1 用户在 shell 环境中可以操作的指令或者可执行文件
2 内核可调用的函数与工具库
3 函数库
4 设备文件说明
5 配置文件
6 游戏
7 协议
8 系统管理员可以使用的管理指令

doc

/usr/share/doc目录下存放了软件的使用说明

关机

who

who # 查看在线的用户

sync

sync # 关机之前需要强制内存中的数据同步到磁盘

shutdown

# shutdown [-krhc] 时间 [信息]
-k : 不会关机,只是发送警告信息,通知所有在线的用户
-r : 将系统的服务停掉后就重新启动
-h : 将系统的服务停掉后就立即关机
-c : 取消已经在进行的 shutdown

重启

reboot

PATH

环境变量,用来声明可执行文件的路径,路径之间用 : 分隔

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

sudo

允许一般用户执行只有root用户才能执行的命令,只有在/etc/sudoers中配置的用户才能执行

包管理工具

发行版

Linux发行版指的Linux内核及各种应用软件的集成版本

VIM

三个模式

批注 2020-03-03 194041

GNU

GNU的目标是创建一套完全自由的操作系统,称为 GNU,其内容软件完全以 GPL 方式发布

磁盘文件名

在Linux,硬件都被当成一个文件

文件系统

文件读取

先根据inode查询出所有block,然后再把block里的文件内容读出来

这种文件系统没有inode,每个block就像一个链表,存储着下一个block的编号

磁盘碎片

指一个文件的block过于分散,磁盘读取时磁头移动距离过大

目录

一个目录最少分配一个inode与一个block,block记录了目录下所有文件的inode以及文件名

日志

ext3/ext4 文件系统引入了日志功能,可以利用日志来修复文件系统

挂载

利用目录作为文件系统的进入点

目录配置

Filesystem Hierarchy Standard (FHS) 规定了 Linux 的目录结构:

文件

文件属性

drwxr-xr-x 4 my   my   4096 Mar  4 12:04 ./

文件与目录的基本操作

列出文件或者目录的信息,目录的信息就是其中包含的文件

# ls [-aAdfFhilnrRSt] file|dir
-a :列出全部的文件
-d :仅列出目录本身
-l :以长数据串行列出,包含文件的属性与权限等等数据

更换当前目录

cd [相对路径或绝对路径,如果不填默认是~]
# mkdir [-mp] 目录名称
-m :配置目录权限
-p :递归创建目录

删除空目录

rmdir [-p] 目录名称
-p :递归删除目录

更新文件时间或者建立新文件

# touch [-acdmt] filename
-a : 更新 atime
-c : 更新 ctime,若该文件不存在则不建立新文件
-m : 更新 mtime
-d : 后面可以接更新日期而不使用当前日期,也可以使用 --date="日期或时间"
-t : 后面可以接更新时间而不使用当前时间,格式为[YYYYMMDDhhmm]

复制文件

cp [-adfilprsu] source destination
-a :相当于 -dr --preserve=all
-d :若来源文件为链接文件,则复制链接文件属性而非文件本身
-i :若目标文件已经存在时,在覆盖前会先询问
-p :连同文件的属性一起复制过去
-r :递归复制
-u :destination 比 source 旧才更新 destination,或 destination 不存在的情况下才复制
--preserve=all :除了 -p 的权限相关参数外,还加入 SELinux 的属性, links, xattr 等也复制了

删除文件

# rm [-fir] 文件或目录
-r :递归删除
-i: 删除前询问
-f:强制删除

移动文件

# mv [-fiu] source destination
# mv [options] source1 source2 source3 .... directory
-f : force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖

修改权限

# chmod [ugoa]  [+-=] [rwx] dirname/filename
- u:拥有者
- g:所属群组
- o:其他人
- a:所有人
- +:添加权限
- -:移除权限
- =:设定权限
# 为所有人添加可执行权限
chmod a+x test.sh

默认权限

文件的默认权限是-rw-rw-rw- ,没有可执行权限

目录的默认权限是drwxrwxrwx

目录权限

文件名不是存储在一个文件的内容中,而是存储在一个文件所在的目录中。因此,拥有文件的 w 权限并不能对文件名进行修改

目录存储文件列表,一个目录的权限也就是对其文件列表的权限。因此,目录的 r 权限表示可以读取文件列表;w 权限表示可以修改文件列表,具体来说,就是添加删除文件,对文件名进行修改;x 权限可以让该目录成为工作目录,x 权限是 r 和 w 权限的基础,如果不能使一个目录成为工作目录,也就没办法读取文件列表以及对文件列表进行修改了

链接

# ln [-sf] source_filename dist_filename
-s :默认是实体链接,加 -s 为符号链接
-f :如果目标文件存在时,先删除目标文件

批注 2020-03-05 090613

实体链接

实体链接直接链接了源文件的inode

不能跨越文件系统、不能对目录进行链接

ln my.link test.sh

符号链接

符号链接指向的是文件,如果原始文件被删除,符号链接就打不开了

ln -s test.sh symbol.link

获取内容

取得文件内容

# cat [-AbEnTv] filename
-n :打印出行号,连同空白行也会有行号,-b 不会

从最后一行开始打印

可以一页一页查看文件内容

比more多了一个向前翻页的功能

取得文件的前几行

# head [-n number] filename
-n :后面接数字,代表显示几行的意思

head的反向操作,取得后几行

以字符或者十六进制的形式显示二进制文件

指令与文件搜索

# which [-a] command
-a :将所有指令列出,而不是只列第一个
which -a ssh

文件搜索,只搜索几个特定的目录

# whereis [-bmsu] dirname/filename

可以用关键字或者正则表达式进行搜索文件

locate 使用 /var/lib/mlocate/ 这个数据库来进行搜索,它存储在内存中,并且每天更新一次,所以无法用 locate 搜索新建的文件。可以使用 updatedb 来立即更新数据库

# locate [-ir] keyword
-r:正则表达式

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

# find [basedir] [option]
example: find . -name "shadow*"

与时间有关的选项:

-mtime  n :列出在 n 天前的那一天修改过内容的文件
-mtime +n :列出在 n 天之前 (不含 n 天本身) 修改过内容的文件
-mtime -n :列出在 n 天之内 (含 n 天本身) 修改过内容的文件
-newer file : 列出比 file 更新的文件

2020359306

与文件拥有者和所属群组有关的选项:

-uid n
-gid n
-user name
-group name
-nouser :搜索拥有者不存在 /etc/passwd 的文件
-nogroup:搜索所属群组不存在于 /etc/group 的文件

与文件权限和名称有关的选项:

-name filename
-size [+-]SIZE:搜寻比 SIZE 还要大 (+) 或小 (-) 的文件。这个 SIZE 的规格有:c: 代表 byte,k: 代表 1024bytes。所以,要找比 50KB 还要大的文件,就是 -size +50k
-type TYPE
-perm mode  :搜索权限等于 mode 的文件
-perm -mode :搜索权限包含 mode 的文件
-perm /mode :搜索权限包含任一 mode 的文件

压缩与打包

压缩指令

使用 zcat、zmore、zless 来读取压缩文件的内容

$ gzip [-cdtv#] filename
-c :将压缩的数据输出到屏幕上
-d :解压缩
-t :检验压缩文件是否出错
-v :显示压缩比等信息
-# : # 为数字的意思,代表压缩等级,数字越大压缩比越高,默认为 6

使用bzcat、bzmore、bzless、bzgrep读取压缩文件的内容

$ bzip2 [-cdkzv#] filename
-k :保留源文件

查看命令:xzcat、xzmore、xzless、xzgrep

打包

压缩指令只能对一个文件进行压缩,打包能够将多个文件打包成一个大文件

-z :使用 zip;
-j :使用 bzip2;
-J :使用 xz;
-c :新建打包文件;
-t :查看打包文件里面有哪些文件;
-x :解打包或解压缩的功能;
-v :在压缩/解压缩的过程中,显示正在处理的文件名;
-f : filename:要处理的文件;
-C 目录 : 在特定目录解压缩。

一些范例

使用方式 命令
打包压缩 tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称
查 看 tar -jtv -f filename.tar.bz2
解压缩 tar -jxv -f filename.tar.bz2 -C 要解压缩的目录

Bash

通过Shell来请求内核提供服务,Bash是Shell的一种

特性

变量操作

# 变量赋值
x=abc
# 输出变量
echo $x # 输出 abc
x="环境变量 = $PATH" # 输出 环境变量 = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
x='x$PATH' # 单引号内不会进行变量替换 它会输出 x$PATH
version=$(uname -r) # 将指令执行结果赋值给变量
$ declare [-aixr] variable
-a : 定义为数组类型
-i : 定义为整数类型
-x : 定义为环境变量
-r : 定义为 readonly 类型

指令搜索顺序

数据流重定向

重定向指的是使用文件代替标准输入、标准输出和标准错误输出

有一个箭头的表示以覆盖的方式重定向,而有两个箭头的表示以追加的方式重定向

1 代码 运算符
标准输入 (stdin) 0 < 或 <<
标准输出 (stdout) 1 > 或 >>
标准错误输出 (stderr) 2 2> 或 2>>
ls &> result # 将ls的所有输出都定向到result文件

管道指令

将一个命令的标准输出作为另一个命令的标准输入

ll | cat -n # 将ll的结果作为cat的输入

提取指令

$ cut
-d :使用分隔符对每行进行分割
-f :经过 -d 分隔后,使用 -f n 取出第 n 个区间
-c :以字符为单位取出区间
last | cut -d ' ' -f 1 # 取出登录的用户

排序指令

$ sort [-fbMnrtuk] [file or stdin]
-f :忽略大小写
-b :忽略最前面的空格
-M :以月份的名字来排序,例如 JAN,DEC
-n :使用数字
-r :反向排序
-u :相当于 unique,重复的内容只出现一次
-t :分隔符,默认为 tab
-k :指定排序的区间
last | cut -d ' ' -f 1 | sort # 对登录用户进行排序

去除重复数据

$ uniq [-ic]
-i :忽略大小写
-c :进行计数
last | cut -d ' ' -f 1 | sort |uniq -c # 统计用户登录次数

双向输出重定向

cat my.link  |tee result # 同时将输出输出到屏幕和result文件

字符转换指令

对字符替换

last | tr '[0-9]' '*' # 把数字替换成*

将tab转换为空格

将 tab 转换一定数量的空格,默认是 8 个

正则表达式

grep

globally search a regular expression and print,使用正则表示式进行全局查找并打印。

$ grep [-acinv] [--color=auto] 搜寻字符串 filename
-c : 统计匹配到行的个数
-i : 忽略大小写
-n : 输出行号
-v : 反向选择,也就是显示出没有 搜寻字符串 内容的那一行
--color=auto :找到的关键字加颜色显示
last |grep 'pts/[0-9]' # 找出pts登录的

printf

printf '%10s \n'  $(last |grep 'pts/[0-9]') # 格式化输出,非管道命令,需要通过$()进行数据传递

awk

awk 每次处理一行,处理的最小单位是字段,每个字段的命名方式为:$n,n 为字段号,从 1 开始,$0 表示一整行

last -n 5 | awk '{print $1 "\t" $3}' # 最近5个登录的用户及ip

进程管理

查看进程

ps -l # 查看自己的进程
ps aux # 查看系统所有进程
pstree -A # 查看所有进程树
top -d 2 # 2秒刷新一次查看进程

进程状态

状态 说明
R running or runnable (on run queue) 正在执行或者可执行,此时进程位于执行队列中。
D uninterruptible sleep (usually I/O) 不可中断阻塞,通常为 IO 阻塞。
S interruptible sleep (waiting for an event to complete) 可中断阻塞,此时进程正在等待某个事件完成。
Z zombie (terminated but not reaped by its parent) 僵死,进程已经终止但是尚未被其父进程获取信息。
T stopped (either by a job control signal or because it is being traced) 结束,进程既可以被作业控制信号结束,也可能是正在被追踪。

批注 2020-03-05 104504

SIGCHLD

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

wait

父进程调用 wait() 会一直阻塞,直到收到一个子进程退出的 SIGCHLD 信号,之后 wait() 函数会销毁子进程并返回

waitpid

作用和 wait() 完全相同,但是多了两个可由用户控制的参数 pid 和 options。

pid 参数指示一个子进程的 ID,表示只关心这个子进程退出的 SIGCHLD 信号。如果 pid=-1 时,那么和 wait() 作用相同,都是关心所有子进程退出的 SIGCHLD 信号。

options 参数主要有 WNOHANG 和 WUNTRACED 两个选项,WNOHANG 可以使 waitpid() 调用变成非阻塞的,也就是说它会立即返回,父进程可以继续执行其它任务

孤儿进程

父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程

孤儿进程将被 init 进程(进程号为 1)所收养,并由 init 进程对它们完成状态收集工作

僵尸进程

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

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