1. 文件和目录
-
cp -r dir1 dir2
- 将目录 dir1拷贝到dir2
- 如果目标文件夹存在,则将源文件夹拷贝到目标文件夹中
- 如果目标文件夹不存在,则创建目标文件夹,将源文件夹中的内容拷贝的目标文件夹中
-
ln /home/a.txt a1.txt
- 给文件创建硬连接
-
ln -s /home home
- 目录只能创建软连接
-
du -sh /home
du:disk usage
:用于计算指定目录和文件的磁盘占用情况。df:disk free
则是看磁盘的使用情况。- 查看文件或目录大小
- s:仅显示目录总大小
- h:human
-
sudo find / -name docker*
- 根据名称查找
-
sudo find / -type d
- 根据类型查找
-
sudo find / -size +100m
- 根据大小查找
-
mv dir1 dir2
- 目录改名或移动
-
tar -zcv -f dir1.tar.gz dir1
- 打包并压缩,先用tar打包,然后用gzip进行压缩
- z:使用gzip解压缩, 最常用的压缩方式,压缩速度快,压缩率还行, 文件后缀最好是tar.gz
- j:使用bzip2解压缩,更高的压缩率,速度相对会慢一点,文件后缀最好是tar.bz2
- J:使用xz解压缩,更更高的压缩率,速度更慢一点,文件后缀最好是tar.xz
- v: 列出过程详细信息
- c:表示压缩操作
- x:表示解压缩操作
- f:压缩的文件,这个选项最好单独写,后面要跟参数。
- -C: chage,可以指定结果存放的目录
-
tar -zxv -f dir1.tar.gz -C /home/ljs
- 先用gzip解压缩,然后解包,最后将结果存于/home/ljs目录下
-
wc -l a.txt
- 统计文件有多少行
- -w: 有多少单词
- -m:有多少字符
- 不加选项则以此列出行数,字数,字符数
-
ls /tmp | tee -a a.txt
- tee将结果同时输出到标准输出和指定文件
-
split -b 100b a.txt prefix
- 将文件拆分为以100字节为大小的小文件,小文件共同前缀为prefix
-l 100
表示按行拆分
-
less a.txt
: less是 more 的增强版,有以下功能上下滚动
- 向下滚动一行:
↓
- 向上滚动一行:
↑
- 向下滚动一页:
空格
- 向上滚动一页:
b
- 向下滚动一行:
跳转
- 跳转到头行:
g
- 跳转到尾行:
G
- 跳转到指定行:
10g
- 跳转到头行:
搜索
- 查找字符串
/字符串
- 跳转到上一个符合的结果:
N
- 跳转到下一个符合的结果:
n
- 查找字符串
行号
- 显示行号:
-N
- 取消行号:
-n
- 在导航栏显示当前页在整个文件中的行数范围:
=
- 显示行号:
1.1 常见的目录或文件
/dev/fd
:目录,哪个进程访问,显示的是那个进程相关的文件描述符/etc/passwd
: 文件 ,存储linux系统所有用户信息- 查看当前进程打开的文件描述符
2. 用户与权限
chmod 777 /home
- 修改目录或文件权限
chown ljs /home/ljs
- 修改文件所属用户
chown ljs:ljs /home/ljs
- 同时修改文件所属用户组
chgrp ljs text.txt
- 修改文件所属用户组
sudo useradd -s /bin/bash -g ljs -d /home/ljs/ -m ljs
- 创建用户
- -s:指定shell
- -m:如果家目录不在则创建
- -g:指定用户的用户组,后面跟的参数可以是用户组名,也可以是gid,前提必须存在。
- -G:指定用户的附加用户组, 如 -G ljs,root 表示给该用户添加两个附加用户组
sudo userdel -r ljs
- -r:连家目录一起删除
sudo passwd ljs
- 为账户设置密码
groupadd [-g gid] 组名
- 创建群组
- -g:指定组id
groupmod -n 新组名 组名
- -n 指定修改后的组名
- -g 111 指定修改后的组id
groupdel 组名
- 删除组
2.1 粘着位(Sticky bit)
- 它是一个权限标志位,
主要应用于目录
- 当某个目录被设置了粘着位后,该目录下的文件只能被
文件所有者
、目录所有者
或root 用户
删除,其他用户即使具有该目录的写权限和可执行权限,也不能删除那些不属于他们的文件。 - 粘着位由一个字符
t
或T
表示- 其他用户对这个目录有执行权限时用小写的
t
- 其他用户对这个目录无执行权限时用大写的
T
- 其他用户对这个目录有执行权限时用小写的
- 如
/tmp
对所有用户开放了读、写、执行权限(即 rwxrwxrwt)(小写t,表示其他用户也有执行权限
),但由于粘着位的存在,用户只能删除自己的临时文件,不能删除别人的。 - 举例
rwxrwxrwT
- 所有者可以浏览、编辑、进入目录,以及删除任何文件;
- 同组用户也可以浏览、编辑、进入目录,但只能删除他们自己的文件;
- 其他用户只能浏览和编辑目录,但不能进入(因为没有执行权限T),也只能删除他们自己的文件(因为设置了粘着位)。
# 给一个目录添加t权限
chmod +t directory
2.2 常见的文件系统
1. FAT
:File Allocation Table
- 链式存储,即文件可能会被分成多个片段,这些片段在磁盘上可能并不连续存储,每个片段都指向下一个片段的位置。
- 在文件系统中维护一个表(File Allocation Table),这个表记录了文件分配的信息。
- 目录是以一个个条目(Directory Entries)的方式组织的,每个条目包含了文件名、大小、创建时间等元数据信息,以及文件第一个片段在 FAT 表中的位置。
2. etx4: 第四代扩展文件系统
linux默认文件系统
- ext4 文件系统的主要组件:
Superblock
:它存储了文件系统的重要参数,比如 inodes 总数,blocks 总数等,并且它还有关于文件系统状态的信息。Block Bitmap
:它跟踪每个 block 组(block group)中哪些 blocks 是使用着的。Inode Bitmap
:它跟踪每个 block 组中哪些 inodes 是使用着的。Inode Table
:它包含了每个文件的元数据,这些元数据包括文件所有者,文件权限,文件大小以及指向文件数据 blocks 的指针。Data Blocks
:实际包含文件数据的地方。
- 基本工作原理
- 文件存储在多个数据 blocks 中。文件的元数据存储在 inode 中,这包括了指针指向文件数据的位置。inode 本身也存储在特定的 inode block 中。
- 当你创建一个新的文件,系统会分配一个空闲 inode 来存储文件信息,并在数据区域找到空闲的 blocks 来存储文件数据。之后,空闲的 inode 和 blocks 会在 inode bitmap 和 block bitmap 中标记为已使用。
- 当访问一个现有文件时,系统会按照文件路径找到对应的 inode,并通过 inode 中的信息找到并查看文件的数据。
- 当删除一个文件时,系统会释放文件数据所使用的 blocks,并标记这些 blocks 在 block bitmap 中为空闲。然后系统释放该文件的 inode,并标记 inode bitmap 中相应的 bit 为空闲。
- ext4 文件系统使用了
extents
来管理数据blocks
,它是连续的物理块序列。使用extents
,文件系统可以在磁盘上存储大量连续的数据,可以大大提高连续读写的性能并减少碎片。 - ext4 文件系统通过日志系统(Journaling)来保证文件系统一致性。如果在写文件的时候有任何问题(比如断电),那么在系统启动的时候就可以通过检查日志来修复文件系统。
对于文件
- inode存储的是文件的元信息
- block块存储的是文件的数据信息
inode中其实是没存储文件名的
对于目录
- inode存储的是目录的元信息
- block块存储的是
目录下所有文件和子目录的名字,以及这些名字所对应的 inode 编号
linux的根目录的inode的编号被固定位2
3. 磁盘管理
fdisk -l
- 查看磁盘设备信息
df -h
- 查看磁盘使用情况,每个分区/文件系统使用情况
- -h:human
mount /dev/sda1 /home
- 将设备挂载到指定目录
sudo unmount /dev/sda1
- 卸载设备
- -v 显示详情
- 可以选择通过设备名卸载,也可以选择通过挂载点卸载
4. 进程管理
ps -ef
带单连字符的是Unix风格的选项
- -e :every 显示所有进程
- -f : full 显示完整格式的输出
- -F: full format 比 -f 还全的格式输出。
UID
: 启动该进程的用户PID
: 进程IDPPID
:父进程ID (如果该进程是由另一个进程启动的)C
:进程生命期的CPU使用率(使用CPU的时间/总的运行时间)STIME
:进行启动的系统时间TTY
:进程是从哪个终端启动的TIME
:进程的累计CPU时间CMD
:启动的程序名称
ps -l
F
flag进程标志,是个十六进制整数0x001
: forked but didn’t exec0x004
: used super-user privileges这些标志中可以按位操作组合,比如5对应1+4,两者满足
S
state进程状态D
:不可被打断睡眠,通常等待IO操作的出现- 进程在等待一个事件,通常设计内核同步原语,用于保证资源访问的一致性
- 该状态不响应信号,即使终止信号。只有等待事件完成后,进程才会响应信号和退出
- 一旦进程正在等待的事件完成后,它将会被唤醒并恢复运行。
- 这个状态一般极其短暂。
R
: running,进程可运行(正在运行或等待运行)S
:可中断睡眠,等待事件完成(可以被中断而退出)T
:已终止,因为信号量而终止执行的进程Z
:zombie 僵尸进程,子进程已终止但未被父进程清理的进程
PRI
: 优先级priority,数值越小优先级越高,它是由nice值、内核内部数据结构以及其他因素共同决定的NI
:nice值,会影响PRI。nice的范围是-20(最高优先级)到+19(最低优先级),默认为0。降低nice值可以使得进程有更高的优先级。但只有特权用户才有资格降低进程的nice值。普通用户只能增加进程的nice值,这样它们的创建的进程才不会对其他进程产生不利影响。ADDR
:此值现在没啥实际意义,主要是提供向后兼容性SZ
:进程镜像大小,用于表示进程持有的页面数量WCHAN
:监视通道(wait channel),表示进程正在等待资源的内核函数名。当进程处于S状态,通常会有WCHAN值
ps -L
-L
:显示进程的所有线程信息LWP
: light weight process轻量级进程(线程) ID
ps l
-
不带连字符的是BSD风格选项
-
l
表示采用长格式显示
-
VSZ
(virtual memory size)进程占用的虚拟内存大小,以KB为单位 -
RSS
(resident set size) 进程在物理内存的实际占用的大小(不包括交换空间),以KB为单位。 表示该进程所需要的常驻内存,即RAM中所有活动部分的大小。包括进程的代码、数据和共享库在内存中的部分。通常VSZ要高于RSS -
STAT
:代表当前进程状态的多字符状态码(第一个字符采用了与Unix风格的S输出列相同的值,表明进程是在休眠、运行还是等待
第二个字符以及后面的字符是对进程的状态进一步说明) -
<
:该进程以高优先级运行 -
N
:该进程以低优先级运行 -
s
:该进程是控制进程 -
l
:该进程拥有多线程 -
+
:该进程在前台运行 -
ps aux | grep mysql
- a:显示所有与终端关联的进程(无论是不是当前用户的进程)(有交互的进程)
- u:显示用户以及其他信息
- x:显示没有控制终端的进程(没有交互的进程)
-
ps aux -L
- 显示线程id
ps axo cmd,pid,lwp,%cpu,%mem k %cpu
- o: 选择指定列输出. 用逗号分隔字段名列表
- k:选择指定列排序,如果想按照多个键排序,可以用逗号分隔排序键。并可以通过+,-来控制升降序(
ps k -%cpu
)
ps --forest
-
双连字符是GUN长选项风格,它可以和Unix或BSD风格一起定制输出
-
--forest
:能够追踪父子进程 -
kill -9 89899
- kill 命令是给进程发送信号,常见的信号有:
-15
: SIGTERM 默认信号,让进程正常地终止,运行进程完成清理工作-9
: 强制终止进程。当进程无法响应 SIGTERM 时使用。
-
pkill http*
- 支持按程序名进行终止进程,程序名支持通配符
一些常见的系统信号
:系统信号都有默认处理,有些信号我们可以捕获进行自定义处理,有些不能捕获
SIGINT
(2):中断信号,当用户按下Ctrl+C
时由终端发出。等程序收到这个信号默认会终止运行(不会做清理工作)。但我们可以在程序里捕获这个信号,进行一些清理工作后再退出
。SIGQUIT
(3):Quit 信号,当用户按下Ctrl+\
时由终端发出。默认行为是终止进程,并产生一个核心转储文件(core dump),除非核心转储文件的生成被禁用。同样这个信号也是可以在程序中捕获的,我们可以自定义处理逻辑
SIGKILL
(9):终止信号,这个信号不能被捕获或忽略,因此它总是会导致进程终止。
SIGTERM
(15):终止信号,这是 kill 命令默认的信号类型,程序收到这个信号默认会终止运行(不会做清理工作)。但我们可以在程序里捕获这个信号,进行一些清理工作后再退出
。
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
)
func main() {
// 创建一个接收信号的通道
sigs := make(chan os.Signal, 1)
// 创建一个接收退出通知的通道
done := make(chan bool, 1)
// 注册要捕获的信号(SIGINT 和 SIGTERM)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
// 创建一个协程,该协程会阻塞,直到有信号发送至sigs通道
go func() {
sig := <-sigs
fmt.Println("Received Signal:", sig)
// TODO 处理工作这里省略
done <- true
}()
fmt.Println("Waiting for signals...")
<-done
fmt.Println("Exiting...")
}
-
top
: ps 是看进程的瞬时信息,而 top 则是看进程的实时信息。
-
显示内容
up 88 days, 13.27
: 系统运行了多久1 user
: 一个用户登录到系统load average: 0.05, 0.10, 0.11
:系统过去一分钟、过去五分钟、过去十五分钟的平均负载。这个值小于核心数则表示负载不是很重,大于核心数则表示负载有点重。第二行描述了当前有多少任务数,以及任务状态
第三行为 CPU 利用率,单位为百分比
us
: User CPU time. CPU 在用户态下执行时间百分比(这个值较高则说明用户程序正在积极使用 CPU)(这里面不包括 nice 值调高的进程在用户态下的执行时间)sy
: System CPU time.CPU 在内核情况下的执行时间百分比ni
:Nice CPU time,CPU 在用用户态下执行 nice 值较高的程序时间百分比(nice 值较高则说明优先级较低)ni值越高则可能意味着低优先级进程正在积极使用 CPU
id
: idle,CPU 空闲的时间百分比。这里不包括因为等待IO 而空闲的时间wa
:I/O Wait CPU time,CPU 等待 I/O 操作完成而无法执行任务的时间百分比hi
:Hardware Interrupt CPU time, CPU处理硬中断的时间百分比si
:Software Interrupt CPU time,CPU处理软中断的时间百分比st
:如果当前机器是虚拟机
,则这个是等待其他虚拟机释放的 CPU所占的时间百分比。一个物理主机上通常运行多个虚拟机(宿主)。当这些虚拟机试图获取 CPU 资源时,它们可能需要等待其他虚拟机释放 CPU 资源。
第四行为内存的使用情况,单位 KB
总内存
空闲的内存
已经使用的内存
用作 buff/cache的内存
:buff 的作用是为将多次 io 操作收集起来批量操作;cache 的作用热点数据放到内存中,由访问磁盘改为访问内存,起加速的作用。
第五行未交换区的使用情况,单位 KB
。交换区(Swap)是指磁盘上的一部分空间,它被操作系统用于临时存储 RAM 中不活跃的内存数据。第六行空格,第七行描述了各个进程的信息
VIRT
:虚拟内存使用量RES
:物理内存使用量SHR
:进程与其他进程的共享内存总量S
: 进程的状态TIME+
:从启动以来的 CPU 时间占用
-
常用操作
进程排序
P
: 按 CPU 利用率排序M
:按内存利用率排序T
: 按运行时间排序R
: 反转排序
进程筛选
U
: 按用户进行筛选:按 U 后输入用户名再按回车以显示该用户进程;按 U 后直接按回车以显示所有用户的进程。p
: 按进程 ID 进行筛选:按 p 后输入进程 ID 再按还回车则显示该进程;按 p 后直接回车在显示所有进程
终止进程
k
: 后面有提示,按照提示操作就行(原理跟 kill 一样)
显示模式
1
: 可以查看每个 CPU 的使用情况z
: 彩色和黑白之间切换
退出
:q
-
uptime
- 查看cpu平均负载情况
- 显示系统过去1分钟、5分钟、15分钟的平均负载
- 负载情况一般小于 cpu核数*0.7 比较好
5. 网络管理
-
host www.baidu.com
- 查看网站ip
-
curl www baidu.com
- 模拟客户端发送请求
-
telnet 192.168.12.36 80
- 远程连接
-
ss -lnt
- 显示socket情况(可以用来查看端口号被那个程序占用)
- l:listen,显示监听的socket
- n:不解析服务名称(加了这个参数,端口号处会显示端口号,不加可能会显示的是服务(程序)名)
- t:只显示tcp socket
- u: 只显示 udp socket
-
过时命令
nslookup
:被host淘汰netstat
:被ss淘汰
5. vim
gg
- 光标移动到第一行
G
- 光标移动到最后一行
^
- 光标移动到当前行行首,也可以用 0
$
- 光标移动到当前行行尾
12gg
- 光标移动到第12行,也可以使用 12G
dd
- 删除当前行
3dd
- 删除从当前行开始三行
d^
- 删除光标到行首的字符,也可以用 d0
d$
- 删除光标到行尾的字符,也可以用D
yy
- 复制当前行
3yy
- 从当前行开始,复制三行
p
- 在当前行下一行粘贴
i
- 当前光标处插入
o
- 当前行下新起一行插入
A
- 当前行行尾插入
/hello
- 文件中查找字符串hello
- n:下一个
- N:上一个
x
- 删除光标后的一个字符(包括光标处)
X
- 删除光标前的一个字符
:1,100s/word1/word2/g
- 将第一行到第一百行所有的word1替换成word2
%s/word1/word2/g
- 将 所有的word1替换成word2
:set nu
- 显示行号
set nonu
- 不显示行号