Loading... > 1. 这是学习 2021韩顺平 一周学会Linux (BV1Sv411r7vd)时记录的笔记 > 2. 我使用的是hyper-v虚拟机,与视频中讲解的vmware有些许出入 > 3. 系统宿主机Windows Server,虚拟机Centos7.9,ssh工具是Bitvise # Linux基础篇 ## 树状结构 - linux的文件系统是采用层级式的树状目录结构,在此结构中最上层是根目录"/",然后在此目录下再创建其他的目录 - 记住一句经典的话:在Linux世界里,一切皆文件 ## 具体的目录 ![image-20221120151644467](http://storage.live.com/items/FECD80CE4F909A96!43935:/image-20221120151644467.png?authkey=ACq2Th7Y5h6owsM) - `/bin` **[常用]** `(/usr/bin 、/usr/local/bin)` 是Binary的缩写,这个目录存放着最经常使用的命令 - `/sbin` `(/usr/sbin 、/usr/local/sbin)` s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。 - `/home` **[常用]** 存放普通用户的主目录,在Linux中每个用户都有一一个自己的目录,一般该目录名是以用户的账 号命名 - `/root` **[常用]** 该目录为系统管理员,也称作超级权限者的用户主目录 - `/lib` 系统开机所需要最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库 - `/lost+found` 这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件 - `/etc` [常用] 所有的系统管理所需要的配置文件和子目录 - `/usr` [常用] 这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似与windows下的program files目录。 - `/boot` [常用] 存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件 - `/proc` 这个目录是一-个虚拟的目录,它是系统内存的映射,访问这个目录来获取系统信息 - `/srv` service缩写 ,该目录存放一些服务启动之后需要提取的数据 - `/sys` 这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统sysfs - `/tmp` 这个目录是用来存放一些临时文件的 - `/dev` 类似于windows的设备管理器,把所有的硬件用文件的形式存储 - `/media` [常用] linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后, linux会把识别的设备挂载到这个目录下 - `/mnt` [常用] 系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将外部的存储挂载在/mnt/上然后进入该目录就可以查看里的内容了。 - `/opt` 这是给主机额外安装软件所摆放的目录。如安装ORACLE数据库就可放到该目录下。默认为空 - `/usr/local` [常用] 这是另一个给主机额外安装软件所安装的目录。一般是通过编译源码方式安装的程序 - `/var` [常用] 这个目录中存放着在不断扩充着的东西,习惯将经常被修改的目录放在这个目录下。包括各种日志文件 - `/selinux` [security- enhanced linux] SELinux是一种安全子系统,它能控制程序只能访问特定文件,有三种工作模式,可以自行设置. # Linux实操篇 ## 关机与重启 | 命令 | 说明 | | ----------------- | ------------------------ | | shutdown -h now | 立刻进行关机 | | shutdown -h 1 | 1分钟后关机 | | shutdown -r now | 现在重新启动 | | halt | 关机,作用与上面相同 | | reboot | 重启计算机 | | sync | 把内存的数据同步到磁盘 | > 1. 不管是重启系统还是关闭系统,首先要运行sync命令,把内存中的数据写到磁盘中 > 2. 目前的shutdown/reboot/halt等命令均已经在关机前进行了sync ,老韩提醒:小心驶得万年船 ## 用户登录和注销 1. 登录时尽量少用roo1帐号登录,因为它是系统管理员,最大的权限,避免操作失误。可以利用普通用户登录,登录后再用”su-用户名’命令来切换成系统管理员身份. 2. 在提示符下输入logout即可注销用户 > 注意:logout注销指令在图形运行级别无效,在运行级别3下有效. ## 用户管理 Linux系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请个账号,然后以这个账号的身份进入系统 ### 添加用户 语法: `useradd 用户名` 1. 当创建用户成功后,会自动创建和用户同名的home目录 2. 也可以通过`useradd -d 目录 用户名`,给新创建的用户指定家目录 ```shell [root@localhost zerolouis]# useradd milan ``` ### 修改密码 语法: `passwd 用户名` 若**不指定用户名**,则设置的是**当前用户**的密码 ```shell [root@localhost zerolouis]# passwd milan 更改用户 milan 的密码 。 新的 密码: 重新输入新的 密码: passwd:所有的身份验证令牌已经成功更新。 ``` ### 删除用户 语法: 1. `userdel 用户名` 删除用户 2. `userdel -r 用户名` 删除用户以及home目录 一般情况下建议保留home目录 ```shell [root@localhost zerolouis]# userdel -r milan ``` ### 切换用户 语法: `su - 用户` > 1. 从权限高的用户切换到权限低的用户,不需要输入密码 > 2. 当需要返回到原来用户时,使用exit/logout命令 > 3. 使用 su 命令时,有 - 和没有 - 是完全不同的,- 选项表示在切换用户身份的同时,连当前使用的环境变量也切换成指定用户的。我们知道,环境变量是用来定义操作系统环境的,因此如果系统环境没有随用户身份切换,很多命令无法正确执行。 ```shell [zerolouis@localhost home]$ su - root 密码: 上一次登录:日 11月 20 15:09:36 CST 2022pts/0 上 [root@localhost ~]# su - zerolouis 上一次登录:日 11月 20 15:09:23 CST 2022从 juju-r7000p.lanpts/1 上 [zerolouis@localhost ~]$ ``` ### 查看当前用户 语法: `whoami`,`who am i` ### 用户组 类似于角色,系统可以对有共性/权限的多个用户进行统一的管理 | 命令 | 说明 | 例子 | | ---------------------------- | ---------------------- | ------------------------ | | `groupadd 组名` | 添加一个组 | `groupadd cat` | | `groupdel 组名` | 删除一个组 | `groupadd cat` | | `useradd -g 用户组 用户名` | 增加用户时直接添加组 | `useradd -g cat tom` | | `usermod -g 用户组 用户名` | 修改用户的组 | `usermod -g cat jerry` | ### 用户与组织的相关文件 - `/etc/passwd` 文件 **用户(user)**的配置文件,记录用户的各种信息 用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell ![image-20221120153247548](http://storage.live.com/items/FECD80CE4F909A96!43936:/image-20221120153247548.png?authkey=ACq2Th7Y5h6owsM) - `/etc/shadow`文件 **口令**的配置文件 登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志 ![image-20221120153433730](http://storage.live.com/items/FECD80CE4F909A96!43937:/image-20221120153433730.png?authkey=ACq2Th7Y5h6owsM) - `/etc/group`文件 **组(group**)的配置文件,记录Linux包含的组的信息 组名:口令:组标识号:组内用户列表 ![image-20221120153506706](http://storage.live.com/items/FECD80CE4F909A96!43938:/image-20221120153506706.png?authkey=ACq2Th7Y5h6owsM) ## 实用指令 ### Linux运行级别 | 级别 | 说明 | | ------ | ------------------------ | | 0 | 关机 | | 1 | 单用户[找回丢失密码] | | 2 | 多用户状态没有网络服务 | | 3 | 多用户状态有网络服务 | | 4 | 系统未实用保留给用户 | | 5 | 图形界面 | | 6 | 系统重启 | 常用运行级别是3和5,也可以指定默认运行级别 语法: `init [级别]` ### Centos7以后运行级别说明 centos6以前,在/etc/inittab文件中 这之后进行了简化 `multi-user.target: analogous to runlevel 3` `graphical.target: analogous to runlevel 5` 获取当前默认运行级别:`systemctl get-default` 设置默认运行级别:`systemctl set-default TARGET.target` ```shell [root@localhost ~]# systemctl get-default multi-user.target ``` ### 找回root密码 1. 在开机选择引导的界面,按下`e` 2. 找到Linux16所在行,在行的末尾添加`init=/bin/sh`,使用单用户模式启动。添加完成后使用`Ctrl+X`保存引导并启动 3. 挂载根目录`mount -o remount, rw /` 4. 修改密码`passwd root` 5. 更新下系统信息`touch /.authorelabel` 6. 最后重启系统`exec /sbin/reboot` ### 帮助命令 1. man 获取帮助信息 语法: `man [命令或配置文件]` 例如: `man ls` 2. help 获取shell内置命令的帮助信息 ### 文件目录 1. `pwd` 显示当前工作目录的绝对路径 2. `ls [选项] [目录/文件]` | 常用选项 | 功能 | | ---------- | ------------------------------------------ | | -a | 显示当前目录所有的文件和目录,包括隐藏的 | | -l | 以列表的方式显示信息 | 3. `cd [参数]` 切换到指定目录 `cd ~`或者`cd`回到当前用户的home目录 `cd ..`回到当前目录的上级目录 4. `mkdir [选项] 要创建的目录` 创建目录 | 常用选项 | 功能 | | ---------- | -------------- | | -p | 创建多级目录 | 注意:创建多级目录必须使用-p,否则报错 > 创建一个目录:`mkdir /home/tiger` > > 创建多级目录:`mkdir -p /home/animal/cat` > 5. `rmdir [选项] 要删除的空目录` 删除**空目录** 注意:`rmdir`删除的是空目录,如果不是空目录需要使用`rm -rf`命令 6. `touch 文件名` 创建一个空文件 7. `cp [选项] source dest` 拷贝文件到指定目录 | 常用选项 | 功能 | | ---------- | -------------------- | | -r | 递归赋值整个文件夹 | 强制覆盖使用`\cp` 8. `rm [选项] 要删除的文件或目录` | 常用选项 | 功能 | | ---------- | -------------------- | | -r | 递归删除整个文件夹 | | -f | 强制复制删除不提示 | 9. `mv oldNameFile newNameFile`重命名 `mv /temp/movefile /targetFolder`移动文件 10. `cat [选项] 要查看的文件` 查看文件 | 常用选项 | 功能 | | ---------- | ---------- | | -n | 查看行号 | cat只能浏览文件,而不能修改文件,为了浏览方便,一般会带上**管道命令** `| more` 11. `more 要查看的文件` more命令是一个基于vi编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容。more指令中内置了若干快捷键 ![image-20221121135245177](http://storage.live.com/items/FECD80CE4F909A96!43940:/image-20221121135245177.png?authkey=ACq2Th7Y5h6owsM) 12. `less 要查看的文件` less指令用来分屏查看文件内容,它的功能与more指令类似,但是比more指令更加强大,支持各种显示终端。less指令在显示文件内容时,并不是一次将整个文件加载之后才显示 ,而是根据显示需要加载内容,对于显示大型文件具有较高的效率。 ![image-20221121135605488](http://storage.live.com/items/FECD80CE4F909A96!43941:/image-20221121135605488.png?authkey=ACq2Th7Y5h6owsM) 13. `echo [选项] [输出内容]` 输出内容到控制台 例如: 输出环境变量 `echo $PATH` 14. `head` head用于显示文件的开头部分内容,默认情况下head指令显示文件的前10行内容 `head 文件` 查看文件的前10行内容 `head -n 5 文件` 查看文件前5行内容 15. `tail` tail用于输出文件尾部的内容,默认情况下tail指令显示文件的前10行内容 `tail 文件` 查看文件尾部10行内容 `tail -n 5 文件` 查看文件尾部5行内容 `tail -f 文件` 实时追踪该文档的所有更新 16. `>`输出重定向和`>>`追加 例如: `ls -l > 文件` 列表的内容写入文件(覆盖写) `ls -al >> 文件` 列表的内容追加到文件中 `cat 文件1 > 文件2` 将文件1的内容覆盖到文件2 `echo "内容" >> 文件` 17. `ln -s [源文件或目录] [软链接名]` 给源文件创建一个软链接 **软链接**也成为符号链接,类似Windows里的快捷方式,主要存放了链接其他文件的路径 > 当问们使用`pwd`指令查看目录时,仍然看到的是软链接所在目录 > ![image-20221121143207972](http://storage.live.com/items/FECD80CE4F909A96!43942:/image-20221121143207972.png?authkey=ACq2Th7Y5h6owsM) 18. `history` 查看已经执行过的历史命令,也可以执行历史命令 例: `history` 显示所有的历史命令 `history 10` 显示最近使用过的10个指令 `!5` 运行曾经执行过的第5挑指令 ### 时间日期类 1. `date` - 查询时间基本语法 `date` 显示当前时间 `date +%Y` 显示当前年份 `date +%m` 显示当前月份 `date +%d` 显示当前是哪一天 `date "+%Y-%m-%d %H:%M:%S"` 显示年月日时分秒 - 设置时间语法 `date -s 字符串时间` ```bash date -s "2020-11-03 20:02:10" ``` 2. `cal [选项]` 查看日历,不加选项显示本月日历 ### 搜索查找类 1. `find [搜索范围] [选项]` find指令将从指定目录向下递归遍历其各个子目录,将满足条件的文件或者目录显示在终端。 | 选项 | 功能 | | ------------------ | ---------------------------------- | | -name <查询方式> | 按照指定的文件名查找模式查找文件 | | -user <用户名> | 查找属于指定用户名的所有文件 | | -size <文件大小> | 按照指定的文件大小查找文件 | ```bash find /home -name hello.java find / -size +200M find /home -user nobody ``` 2. `locate 搜索文件` locate指令可以快速定位文件路径。locate指令利用事先建立的系统中所有文件名称及路径的locate数据库实现快速定位给定的文件。Locate指令无需遍历整个文件系统,查询速度较快。为了保证查询结果的准确度,管理员必须定期更新locate 由于locate指令基于数据库进行查询,所以第一次运行前必须使用`updatedb`指令创建数据库 3. `which` 可以查看某个指令在哪个目录下 ```bash [root@localhost zerolouis]# which reboot /sbin/reboot ``` 4. `grep`指令和管道符号`|` grep过滤查找 管道符|,表示将前一个命令的处理结果输出传递给后面的命令处理 基本语法: `grep [选项] 查找内容 源文件` | 常用选项 | 功能 | | ---------- | ------------------ | | -n | 显示匹配行及行号 | | -i | 忽略字母大小写 | ```bash [root@localhost zerolouis]# cat a.txt | grep -n "yes" 11:yes [root@localhost zerolouis]# grep -n "yes" a.txt 11:yes ``` ### 压缩类 1. `gzip`与`gunzip` `gzip 文件` 压缩文件 `gunzip 文件.gz` 解压文件 2. `zip`与`unzip` `zip [选项] XXX.zip 要压缩的内容` 压缩文件 `unzip [选项] XXX.zip` 解压文件 | zip常用选项 | 功能 | | ------------- | ------------------------ | | -r | 递归压缩,用于压缩目录 | | unzip常用选项 | 功能 | | --------------- | -------------------------- | | -d <文件夹> | 指定解压后文件存放的目录 | 3. `tar` tar是打包指令,最后打包的是.tar.gz文件 `tar [] XXX.tar.gz 要打包的内容` 打包目录 | 常用选项 | 功能 | | ---------- | -------------------- | | -c | 产生.tar打包文件 | | -v | 显示详细信息 | | -f | 指定压缩后的文件名 | | -z | 打包同时压缩 | | -x | 解包.tar文件 | ## 组管理和权限管理 ### Linux组 在linux中的每个用户必须属于一个组 ,不能独立于组外。在linux中每个文件有所有者、所在组、其它组的概念。 1. 所有者 一般为文件的创建者谁创建了该文件,就自然的成为该文件的所有者。 查看文件的所有者: `ls -ahl` 修改文件所有者:`chown 用户名 文件名` ![image-20221122084649541](http://storage.live.com/items/FECD80CE4F909A96!43956:/image-20221122084649541.png?authkey=ACq2Th7Y5h6owsM) 2. 所有组 当某个用户创建了一个文件后,这个文件的所在组就是该用户所在组 查看文件所在的组:`ls-ahl` 修改文件所在的组:`chgrp 组名 文件名` 3. 其他组 除了文件的所有者和所在组的用户外,系统的其他用户都是文件的其他组 4. 改变用户所在组 在添加用户时,可以指定将该用户添加到哪个组中,同样的用root的管理权限可以改变某个用户所在的组。 `usermod -g 新组名 用户名` `usermod -d 目录名 用户名` 改变该用户登录的初始目录。注意:修改后的用户需要拥有进入到该目录的权限 ### 权限 `ls -ahl` 显示如下 ```bash drwxr-xr-x. 3 root root 23 11月 20 15:14 .. -rw-rw-r--. 1 zerolouis zerolouis 262 11月 21 17:17 a.txt ``` 权限的说明 1. 第0位:确定文件类型 `d`:目录文件; `-`:普通文件; `p`:管理文件; `l`:链接文件; `b`:块设备文件; `c`:字符设备文件; `s`:套接字文件。 2. 后面九个字母分别3个为一组(r表示读权限,w表示写权限,x表示可执行权限,-表示无权限) 第1~3位:确定所有者拥有该文件的权限 第4~6位:确定所属组拥有该文件的权限 第7~9位:确定其他用户拥有该文件的权限 ### rwx权限 - rwx作用到文件 1. [ r ]代表可读(read):可以读取,查看 2. [ w ]代表可写(write):可以修改,但是不代表可以删除该文件,删除一个文件的前提条件是对**该文件所在的目录**有写权限,才能删除该文件 3. [ x ]代表可执行(execute):可以被执行 - rwx作用到目录 1. [ r ]代表可读(read):可以读取, ls查看目录内容 2. [ w ]代表可写(write):可以修改,对目录内创建+删除+重命名目录 3. [ x ]代表可执行(execute):可以进入该目录= - 可以数字来表示rwx r=4,w=2,x=1 例如:rwx=4+2+1=7 - `ls -l`详解 转载自https://blog.csdn.net/zhuoya_/article/details/77418413 ![img](http://storage.live.com/items/FECD80CE4F909A96!43955:/Center.png?authkey=ACq2Th7Y5h6owsM) ### 修改权限 通过`chmod`指令,可以修改文件或目录的权限 - 第一种方式:+,-,=更改权限 u:所有者,g:所有组,o:其他组,a:所有人(u+g+o) 例子: `chmod u=rwx,g=rx,o=x 文件/目录名` 给所有者赋予rwx,所有组赋予rx,给其他组赋予x `chmod o+w 文件/目录名` 给其他人赋予写权限 `chmod a-x 文件/目录名` 给所有人去掉执行权限 - 第二种方式:通过数字更变权限 二进制rwx r=2^2^=4,w=2^1^=2,x=2^0^=1,rwx=4+2+1=7 `chmod u=rwx,g=rx,o=x 文件/目录名` = `chmod 751 文件/目录名` ### 修改文件所有者 `chown newowner 文件/目录` 改变所有者 `chown newowner:newgroup 文件/目录` 改变所有者和所在组 选项:-R 如果是目录,则使其下所有子文件或目录递归生效 ### 修改文件所有组 `chgrp newgroup 文件/目录` 改变所有组 ## 定时任务调度 ### crond任务调度 - 概述 任务调度:是指系统在某个时间执行的特定的命令或程序。 任务调度分类: 1. 系统工作:有些重要的工作必须周而复始地执行。如病毒扫描等 2. 个别用户工作:个别用户可能希望执行某些程序。比如对mysql数据库的备份。 - 基本语法 `crontab [选项]` | 常用选项 | 说明 | | ---------- | ------------------------------- | | -e | 编辑crontab定时任务 | | -l | 查询crontab任务 | | -r | 删除当前用户所有的crontab任务 | - crontab表达式 ``` crontab文件的格式: * * * * * command 分 时 日 月 周 每个时间允许的值和特殊值 分(1-59)(*或*/1表示每分钟) 时(1-23)(0表示0点) 日(1-31) 月(1-12) 周(1-6)(0表示周日) ``` - 特殊符号的说明 | 特殊符号 | 含义 | | ---------- | ----------------------------------------------------------------------------------------------------- | | `*` | 代表任何时间。比如第-个“*"就代表- -小时中每分钟都执行一次的意思。 | | `,` | 代表不连续的时间。比如"0 8,12,16 * * * 命令”, 就代表在每天的8点0分, 12点0分, 16点0分都执行一次命令 | | `-` | 代表连续的时间范围。比如“0 5 * * 1-6 命令”,代表在周-到周六的凌晨5点0分执行命令 | | `*/n` | 代表每隔多久执行一次。比如“*/10 * * * *命令" ,代表每隔10分钟就执行遍命令 | - 案例 | 时间 | 含义 | | ----------------- | --------------------------------------- | | `45 22 * * * *` | 在22:45执行 | | `0 17 * * 1` | 每周一的17:00执行 | | `0 5 1,15 * *` | 每月1号和15号的5:00执行 | | `40 4 * * 1-5` | 每周一到周五的4:40执行 | | `*/10 4 * * *` | 每天的4点,每隔十分钟执行一次 | | `0 0 1,15 * 1` | 每月1号和15号,每周一的0:00会执行任务 | > 注意:星期几和几号最好不要同时出现,因为他们定义的都是天。非常容易让管理员混乱。 > ### at定时任务 - 概念 1. at命令是一次性定时计划任务, at的守护进程atd会以后台模式运行,检查作业队来运行。 2. 默认情况下, atd守护进程每60秒检查作业队列,有作业时,会检查作业运行时间,如果时间与当前时间匹配,则运行此作业。 3. at命令是一次性定时计划任务,执行完一个任务后不再执行此任务了 4. 在使用at命令的时候,一定要保证atd进程的启动,可以使用相关指令来查看 ```bash ps -ef | grep atd ``` - 命令格式 `at [选项] [时间]` 使用`Ctrl + D` 结束at命令的输入 - 选项 | 选项 | 含义 | | --------------- | ---------------------------------------------------------- | | -m | 当指定的任务被完成后,将给用户发送邮件,即使没有标准输出 | | -I | atq的别名 | | -d | atrm的别名 | | -v | 显示任务将被执行的时间 | | -c | 打印任务的内容到标准输出 | | -V | 显示版本信息 | | -q <队列> | 使用指定的队列 | | -f <文件> | 从指定文件读入任务而不是从标准输入读入 | | -t <时间参数> | 以时间参数的形式提交要运行的任务 | - at时间定义 1. 接受在当天的hh:nm (小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。例如:04:00 2. 使用midnight (深夜) , noon (中午), teatime (饮茶时间, -般是下午4点)等比较模糊的词语来指定时间。 3. 采用12小时计时制,即在时间后面加上AM (上午)或PM (下午)来说明是上午还是下午。例如: 12pm 4. 指定命令执行的具体日期,指定格式为month day (月日)或mm/dd/yy (月/日/年)或dd.mm.yy(日.月.年) ,指定的日期必须跟在指定时间的后面。例如: 04:00 2021-03-1 5. 使用相对计时法。指定格式为: now + count time-units,now就是当前时间, time-units是时间单位,这里能够是minutes (分钟)、hours (小时)、days (天)、weeks (星期)。count是时间的数量,几天,几小时。例如: now + 5 minutes 6. 直接使用today(今天)、tomorrow (明天)来指定完成命令的时间。 - 案例: ```bash # 2天后的下午5,点执行/bin/ls /home [root@localhost tmp]# at 5pm + 2 days at> /bin/ls /home<EOT> job 2 at Fri Nov 25 17:00:00 2022 # atq命令来查看系统中没有执行的工作任务 [root@localhost tmp]# atq 2 Fri Nov 25 17:00:00 2022 a root # 明天17点钟,输出时间到指定文件内比如/root/date100.log [root@localhost tmp]# at 5pm tomorrow at> date > /root/date100.log<EOT> job 3 at Thu Nov 24 17:00:00 2022 # 2分钟后,输出时间到指定文件内比如/root/date200.log [root@localhost tmp]# at now + 2 minutes at> date > /roote/date200.log<EOT> job 4 at Wed Nov 23 00:58:00 2022 [root@localhost tmp]# at -l 2 Fri Nov 25 17:00:00 2022 a root 3 Thu Nov 24 17:00:00 2022 a root 4 Wed Nov 23 00:58:00 2022 a root ``` ## Linux磁盘分区、挂载 ### 概念 1. Linux来说无论有几个分区,分给哪一县录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构,Linux中每个分区都是用来组成整个文件系统的一部分。 2. Linux采用了一种叫“载入”的处理方法,它的整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录联系起来。这时要载入的一个分区将使它的存储空间在一个目录下获得。 ### 硬盘 1. Linux硬盘分IDE硬盘和SCSI硬盘,目前基本上是SCSI硬盘 2. 对于IDE硬内,驱动器标识符为"hdx~" ,其中"hd"表明分区所在设备的类型,这里是指IDE硬盘了。"x"为盘号( a为基本盘, b为基本从属盘,c为辅助主盘, d为辅助从属盘), "~”代表分区前四个分区用数字1到4表示,它们是主分区或扩展分区,从5开始就是逻辑分区。例, hda3表示为第一个IDE硬盘上的第三个主分区或扩展分区,hdb2表示为第二个IDE硬盘上的第二个主分区或扩展分区。 3. 对于SCSI硬盘则标识为"sdx~" , SCSI硬盘是用"sd" 来表示分区所在设备的类型的,其余则和IDE硬盘的表示方法一样。 ### 命令 查看所有设备挂载的情况 `lsblk`或`lsblk -f` ![image-20221123122219912](http://storage.live.com/items/FECD80CE4F909A96!43950:/image-20221123122219912.png?authkey=ACq2Th7Y5h6owsM) ### 挂载的案例 以添加一块硬盘为案例,理解磁盘分区、挂载、卸载的概念 如何增加一块硬盘 1. 虚拟机添加硬盘 2. 分区 3. 格式化 4. 挂载 5. 设置可以自动挂载 #### 1. 添加硬盘(Hyper-v虚拟机) ![image-20221123123040193](http://storage.live.com/items/FECD80CE4F909A96!43952:/image-20221123123040193.png?authkey=ACq2Th7Y5h6owsM) ![image-20221123123020789](http://storage.live.com/items/FECD80CE4F909A96!43951:/image-20221123123020789.png?authkey=ACq2Th7Y5h6owsM) #### 2. 分区 使用fdisk进行分区 `fdisk /dev/sdb` ![image-20221123123254417](http://storage.live.com/items/FECD80CE4F909A96!43953:/image-20221123123254417.png?authkey=ACq2Th7Y5h6owsM) 开始分区后输入n,新增分区,选择p,分区类型为主分区。最后输入w写入分区并退出,若不保存退出输入q ![image-20221123123642445](http://storage.live.com/items/FECD80CE4F909A96!43954:/image-20221123123642445.png?authkey=ACq2Th7Y5h6owsM) #### 3. 格式化 ```bash mkfs -t ext4 /dev/sdb1 ``` #### 4. 挂载 挂载到`/newdisk`文件夹下 ![image-20221123124314517](http://storage.live.com/items/FECD80CE4F909A96!43957:/image-20221123124314517.png?authkey=ACq2Th7Y5h6owsM) 注意:这种方式挂载重启失效 #### 自动挂载 通过修改/etc/fstab实现挂载 添加完成后,执行`mount -a`即刻生效 ![image-20221123125438185](http://storage.live.com/items/FECD80CE4F909A96!43958:/image-20221123125438185.png?authkey=ACq2Th7Y5h6owsM) ### 磁盘情况查询 - `df -h` 查询系统整体磁盘使用情况 - `du -h` 查询指定目录的磁盘占用情况,默认为当前目录 | 常用选项 | | | --------------- | ---------------------------- | | -s | 指定目录占用大小汇总 | | -h | 带计量单位 | | -a | 含文件 | | --max-depth=X | 子目录深度 | | -c | 列出明细的同时,增加汇总值 | #### 磁盘常用指令 1. 统计/opt文件夹下文件的个数 ```shell [root@localhost opt]# ls -l /opt | grep "^-" -rw-r--r--. 1 root root 0 11月 23 19:03 a.txt -rw-r--r--. 1 root root 0 11月 23 19:03 b.txt -rw-r--r--. 1 root root 0 11月 23 19:03 c.java [root@localhost opt]# ls -l /opt | grep "^-" | wc -l 3 ``` 2. 统计/opt文件夹下目录的个数 ```shell [root@localhost opt]# ls -l /opt | grep "^d" | wc -l 3 ``` 3. 统计/opt文件夹下文件的个数,包括子文件夹里的 ```shell [root@localhost opt]# ls -lR /opt | grep "^-" -rw-r--r--. 1 root root 0 11月 23 19:03 a.txt -rw-r--r--. 1 root root 0 11月 23 19:03 b.txt -rw-r--r--. 1 root root 0 11月 23 19:03 c.java -rw-r--r--. 1 root root 0 11月 23 19:10 a.txt -rw-r--r--. 1 root root 0 11月 23 19:10 d.txt -rw-r--r--. 1 root root 0 11月 23 19:11 a.java [root@localhost opt]# ls -lR /opt | grep "^-" | wc -l 6 ``` 4. 统计/opt文件夹下目录的个数,包括子文件夹里的 ```shell [root@localhost opt]# ls -lR /opt | grep "^d" | wc -l 3 ``` 5. 以树状显示目录结构 ```shell [root@localhost opt]# tree . ├── a.txt ├── b.txt ├── c.java ├── temp │ ├── a.txt │ └── d.txt ├── temp2 │ └── a.java └── temp3 ``` ## 网络配置 ### 配置接口 接口配置文件在`/etc/sysconfig/network-scripts/`下,可以根据需要进行配置 ### 设置主机名 1. 为了方便记忆,可以给linux系统设置主机名,也可以根据需要修改主机名 2. 指令`hostname`:查看主机名 3. 修改文件在/etc/hostname指定 4. 修改后,重启生效 ### hosts映射 修改/etc/hosts,通过主机名找到主机 `127.0.0.1 hostname` ## 进程管理 ### 概念 1. 在LINUX中,每个执行的程序都称为一个进程。每一个进程都分配一个ID号(pid,进程号)。 2. 每个进程都可能以两种方式存在的。**前台**与**后台**,所谓前台进程就是用户目前的屏幕上可以进行操作的。后台进程则是实际在操作,但由于屏幕上无法看到的进程,通常使用后台方式执行。 3. 一般系统的服务都是以后台进程的方式存在,而且都会常驻在系统中。直到关机才才结束。 ### 显示系统执行的进程 - 命令:`ps` ![image-20221123202258242](http://storage.live.com/items/FECD80CE4F909A96!43962:/image-20221123202258242.png?authkey=ACq2Th7Y5h6owsM) - ps命令是用来查看目前系统中,有哪些正在执行,以及它们执行的状况。可以不加任何参数. - | 字段 | | | ------ | ---------------------- | | PID | 进程识别号 | | TTY | 终端机号 | | TIME | 此进程所消CPU时间 | | CMD | 正在执行的命令或进程 | - 参数 | 常用参数 | 功能 | | ---------- | ----------------------------- | | -a | 显示当前终端的所有进程信息 | | -A | 显示所有进程 | | -u | 以用户的格式显示进程信息 | | -x | 显示后台进程运行的参数 | | -e | 等于"-A" | | -f | 显示UID,PPIP,C与STIME栏位 | - `ps -aux`字段 ![image-20221123203610014](http://storage.live.com/items/FECD80CE4F909A96!43963:/image-20221123203610014.png?authkey=ACq2Th7Y5h6owsM) - USER: 进程拥有者 - PID: 进程号 - %CPU: 占用的 CPU 使用率 - %MEM: 占用的物理内存使用率 - VSZ: 占用的虚拟内存大小(Virtual Size) - RSS: 进程使用的驻留集大小或者是实际内存的大小 - TTY: 与进程关联的终端(minor device number of tty) - STAT: 该进程的状态: - R 运行 Runnable (on run queue) : 正在运行或在运行队列中等待。 - S 睡眠 Sleeping : 休眠中, 受阻, 在等待某个条件的形成或接受到信号。 - I 空闲 Idle - Z 僵死 Zombie(a defunct process) : 进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放。 - D 不可中断 Uninterruptible sleep (ususally IO) : 收到信号不唤醒和不可运行, 进程必须等待直到有中断发生。 - T 终止 Terminate : 进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行。 - P 等待交换页 - W 无驻留页 has no resident pages : 没有足够的记忆体分页可分配。 - X 死掉的进程 - < 高优先级进程 : 高优先序的进程 - N 低优先 级进程 : 低优先序的进程 - L 内存锁页 Lock : 有记忆体分页分配并缩在记忆体内 - START: 行程开始时间 - TIME: 执行的时间 - COMMAND:所执行的指令 ### 中止进程kill与killall - 概念 若是某个进程执行一半需要停止时,或是已消了很大的系统资源时,此时可以考虑停止该进程。使用kill命令来完成此项任务。 - 基本语法 `kill [选项] 进程号` 通过进程号杀死/中止进程 `killall 进程名称` 通过进程名称杀死进程,也支持通配符,这在系统因负载过大而变得很慢时很有用 - 常用选项 -9 : 表示强迫进程立即停止 ### 查看进程树pstree 安装 `yum -y install psmisc` - 语法 `pstree [选项]` - | 常用选项 | 功能 | | ---------- | -------------------- | | -p | 显示进程的PID | | -u | 显示进程的所属用户 | ![image-20221124192719819](http://storage.live.com/items/FECD80CE4F909A96!43965:/image-20221124192719819.png?authkey=ACq2Th7Y5h6owsM) ## 服务管理 ### 概念 服务(service)本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它程序的请求,比如(mysqld, sshd防火墙等) ,因此我们又称为守护进程,是Linux中非常重要的知识点。 ### service语法 1. `service 服务名 [start | stop | restart | reload | status]` 2. 在CentOS7.0后,很多服务不再使用service,而是systemctl 3. service 指令管理的服务在/etc/init.d查看 ### 查看服务名 1. 使用setup -> 系统服务 查看全部 2. /etc/init.d 查看service指令管理的服务 ### 服务的运行级别(runlevel) - linux系统有7种运行级别:常用的是3和5 运行级别0 :系统停机状态,系统默认运行级别不能设为0 ,否则不能正常启动 运行级别1 :单用户工作状态, root权限,用于系统维护,禁止远程登陆 运行级别2 :多用户状态(没有NFS) ,不支持网络 运行级别3 :完全的多用序状态(有NFS) ,登陆后进入控制台命令行模式 运行级别4 :系统未使用,保留 运行级别5 : X11控制台,登陆后进入图形GUI模式 运行级别6 :系统正常关闭并重启,默认运行级别不能设为6 ,否则不能正常启动 - 开机流程 ```mermaid graph LR a(开机) --> b(BIOS) --> c(/boot)-->d(systemd进程1)-->e(运行级别)-->f(运行级别对应的服务) ``` ### chkconfig指令 - 概念 1. 通过chkconfig命令可以给服务的各个运行级别设置自启动/关闭 2. chkconfig指令管理的服务在/etc/init.d 查看 3. 注意: Centos7.0后,很多服务使用systemctl管理 - 语法 1. 查看服务`chkconfig --list` 2. 指定运行级别开关自启动 `chkconfig --level x 服务名 on/off` - 注意 chkconfig重新设置服务后自启动或关闭,需要重启机器reboot生效 ### systemctl指令 - 概念 1. 基本语法:`systemctl [start| stop | restart | status] 服务名` 2. systemctl指令管理的服务在`/usr/lib/systemd/system`查看 - systemctl设置服务的自启动状态 1. `systemctl list-unit-files [ | grep 服务名]` (查看服务开机启动状态,grep可以进行过滤) 2. `systemctl enable 服务名` (设置服务开机启动) 3. `systemctl disable 服务名` (关闭服务开机启动) 4. `systemctl is-enabled 服务名` (查询某个服务是否是自启动的) - 注意事项 1. 关闭或者启用防火墙后,立即生效。[telnet 测试某个端口即可] 2. 这种方式只是临时生效,当重启系统后,还是回归以前对服务的设置。 3. 如果希望设置某个服务自启动或关闭永久生效,要使用`systemctl [ enable | disable ] 服务名` ### 防火墙 - 命令 1. 打开端口: `firewall-cmd --permanent --add-port=端口号/协议` 2. 关闭端口: `firewall-cmd --permanent --remove-port=端口号/协议` 3. 重新载入,才能生效: `firewall-cmd --reload` 1. 查询端口是否开放: `firewall-cmd --query-port=端口/协议` ### 动态监控top - 概念 top与ps命令很相似。它们都用来显示正在执行的进程。top与ps最大的不同之处,在于top在执行一段时间可以更新正在运行的的进程。 - 语法 `top [选项]` - | 常用参数 | 功能 | | ---------- | ---------------------------------------- | | -d 秒数 | 指定top命令每隔几秒更新。默认是3s | | -i | 使top不显示任何限制或僵死的进程 | | -p | 通过指定监控进程ID来监控某个进程的状态 | - 交互操作 | 操作 | 功能 | | ------ | ----------------------- | | P | 以CPU使用率排序(默认) | | M | 以内存的使用率排序 | | N | 以PID排序 | | q | 退出top | ![image-20221124210524310](http://storage.live.com/items/FECD80CE4F909A96!43968:/image-20221124210524310.png?authkey=ACq2Th7Y5h6owsM) ### 监控网络状态 查看系统网络状态netstat - 基本语法 `netstat [选项]` - | 常用选项 | 功能 | | ---------- | -------------------- | | -an | 按一定顺序排列输出 | | -p | 显示哪个进程在调用 | ![image-20221124210504692](http://storage.live.com/items/FECD80CE4F909A96!43967:/image-20221124210504692.png?authkey=ACq2Th7Y5h6owsM) ## 包管理 ### RPM包的管理 - 概念 1. rpm用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中。它生成具有.RPM扩展名的文件。RPM是RedHat Package Manager ( RedHat软件包管理工具)的缩写,类似windows的setup.exe ,这一文件格式名称虽然打 上了RedHat的标志,但理念是通用的。 2. Linux的分发版本都有采用( suse,redhat, centos等等) ,可以算是公认的行业标准了。 - rmp简单查询 `rpm -qa | grep "name"` - 一个rmp包的基本格式 一个rpm包名: firefox- 60.2.2-1.el7.centos.x86_ 64 - 名称:firefox - 版本号: 60.2.2-1 - 适用操作系统el7.centos.x86 64 表示centos7.x的64位系统 如果是i686、i386表示32位系统, noarch表示通用。 - 常用查询命令 | 命令 | 功能 | | ------------------------ | ----------------------- | | `rpm -qa` | 查询所安装的所有rpm包 | | `rpm -q 软件包名` | 查询软件包是否安装 | | `rpm -qi 软件包名` | 查询软件包信息 | | `rpm -ql 软件包名` | 查询软件包中的文件 | | `rpm -qf 文件全路径名` | 查询文件所属的软件包 | - 卸载rpm软件包 命令:`rpm -e 软件包名` > 注意:如果其他软件包依赖于您要卸载的软件包,卸载时则会产生错误信息,如果我们就是要删除foo这个rpm包,可以增加参数--nodeps ,就可以强制删除,但是一般不推荐这样做,因为依赖于该软件包的程序可能无法运行。 > - 安装rpm软件包 命令:`rpm -ivh 软件包` 说明:-i install 安装,-v verbose 提示,-h hash 进度条 ### yum包的管理 - 概念 Yum是一个Shell前端软件包管理器。 基于FRPM包管理 ,能够从指定的服务器自动 下载RPM包并且安装,可以**自动处理依赖性关系**,并且一次安装所有依赖的软件包。 - 查询yum服务器软件包 命令:`yum list | grep "name"` - 安装yum包 yum install name # Shell编程 ## 概念 Shell是一个命令行解释器 ,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序用户可以用Shell来启动、挂起、停止甚至是编写一些程序。 ## 执行 - 脚本的格式要求 1. 脚本以`#!/bin/bash`开头 2. 脚本需要可执行权限 - 脚本的常用执行方式 1. 赋予脚本脚本可执行权限`chmod +x 脚本`,然后直接执行脚本 2. 使用`sh 脚本`执行,这种方式**不需要**赋予脚本执行权限 ## shell变量 - 概念 1. Linux Shell中的变量分为,系统变量和用户自定义变量。 2. 系统变量: `$HOME`、`$PWD`、`$SHELL`、`$USER`等等,比如: `echo $HOME`等等.. 3. 显示当前shell中所有变量: `set` - 定义变量 1. 定义变量:`变量=值` 2. 撤销变量: `unset 变量` 3. 声明静态变量: `readonly 变量`,注意:不能unset - 定义变量的规则 1. 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。5A=200(x) 2. 等号两侧不能有空格 3. 变量名称一般习惯为大写 - 讲命令的返回值赋给变量 ``` 1. A= `date`反引号,运行里面的命令,并把结果返回给变量A 2. A= $(date)等价于反引号 ``` ```shell #!/bin/bash echo "Hello,World!" #定义变量 A=100 #输出变量需要加上$ echo "A=$A" #撤掉a变量 unset A echo $A #声明静态变量 readonly B=200 echo "B=$B" ``` ## 设置环境变量 - 基本语法 1. `export 变量名=变量` 将shell变量输出为环境变量 2. `source 配置文件` 让修改后的配置信息立即生效 3. `echo $变量名` 查询环境变量的值 ## 参数 - 概念 当我们执行一个shell脚本时 ,如果希望获取到命令行的参数信息,就可以使用到位置参数变量 比如: `./myshell.sh 100 200` ,这个就是一个执行shell的命令行 ,可以在myshell脚本中获取到参数信息 - 基本语法 | 参数 | 说明 | | --------------------------------------------------------------------------------------------------------------------- | ------------------------ | | `$n` | n为数字, `$0`代表命令本身, `$1-$9`代表第一到第九个参数, 十以上的参数,十以上的参数需要用大括号包含,如`${10}` | | | `$*` | 命令行中所有的参数, `$*`把所有的参数看成一个整体 | | | `$@` | 也代表命令行中所有的参数,不过`$@`把每个参数区分对待 | | | `$#` | 命令行中所有参数的个数 | ## 预定义变量 - 概念 shell中事先已经定义好的变量,可以直接在shell脚本中使用 - 基本语法 | 参数 | 说明 | | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `$$` | 当前进程的进程号(PID) | | `$!` | 后台运行的最后一个进程的进程号(PID) | | `$?` | 最后一次执行的命令的返回状态如果这个变量的值为0 ,证明上一个命令正确执行;如果这个变量的值为非0 (具体是哪个数,由命令自己来决定) ,则证明上一个命令执行不正确了。 | ## 运算符 运算符详解[菜鸟教程-Shell 运算符](https://www.runoob.com/linux/linux-shell-basic-operators.html) 基本语法 1. `$((运算式))`或`$[运算式]`或者`expr m 运算符 n` 2. 使用`expr`时运算符之间要有空格 3. `expr m - n` 4. `expr \*,/,%` 乘法,除法,取余 ```shell #!/bin/bash #计算(2+3)x4的值 #第一种方式 RES1=(((2+3)*4)) # 20 #第二种方式 RES2=$[(2+3)*4] # 20 #第三种写法(中间)必须有空格 #TEMP=expr 2+3 # 2+3 TEMP=`expr 2 + 3` # 5 RES4=`expr $TEMP \* 4` # 20 ``` ## 条件判断 - 基本语法 `[ condition ]` 注意空格 非空返回true,可使用`$?`验证(0为空,>1为false) - | 例子 | 说明 | | --------------------------- | ------- | | `[ tset ]` | true | | `[ ]` | false | | `[ condition ] && echo OK | | - 条件判断详解[菜鸟教程-Shell test 命令](https://www.runoob.com/linux/linux-shell-test.html) - 数值判断 | 参数 | 说明 | | :------ | :--------------- | | `-eq` | 等于则为真 | | `-ne` | 不等于则为真 | | `-gt` | 大于则为真 | | `-ge` | 大于等于则为真 | | `-lt` | 小于则为真 | | `-le` | 小于等于则为真 | - 字符串判断 | 参数 | 说明 | | :------------ | :------------------------- | | `=` | 等于则为真 | | `!=` | 不相等则为真 | | `-z 字符串` | 字符串的长度为零则为真 | | `-n 字符串` | 字符串的长度不为零则为真 | - 文件判断 | 参数 | 说明 | | :------------ | :------------------------------------- | | `-e 文件名` | 如果文件存在则为真 | | `-r 文件名` | 如果文件存在且可读则为真 | | `-w 文件名` | 如果文件存在且可写则为真 | | `-x 文件名` | 如果文件存在且可执行则为真 | | `-s 文件名` | 如果文件存在且至少有一个字符则为真 | | `-d 文件名` | 如果文件存在且为目录则为真 | | `-f 文件名` | 如果文件存在且为普通文件则为真 | | `-c 文件名` | 如果文件存在且为字符型特殊文件则为真 | | `-b 文件名` | 如果文件存在且为块特殊文件则为真 | ```shell #!/bin/bash #案例1:"OK"是否等于"OK" if [ "OK" = "OK" ] then echo "OK equal OK" fi #案例2:23是否大于等于22 if [ 23 -ge 22 ] then echo "23大于等于22" fi #案例3:/root/shcode/aaa.txt 目录中的文件是否存在 if [ -f /root/shcode/aaa.txt ] then echo "存在" fi ``` ## 流程控制 [菜鸟教程-Shell 流程控制](https://www.runoob.com/linux/linux-shell-process-control.html) - if 判断 ```shell #!/bin/bash if [ 条件判断式 ] then 代码 elif [ 条件判断式 ] then 代码 else 代码 fi ``` - case ```shell #!/bin/bash case $1 in "1") echo '输入1' ;; "2") echo '输入2' ;; "3") echo '输入3' ;; "4") echo '输入4' ;; *) echo '你没有输入 1 到 4 之间的数字' ;; esac ``` - while ```shell #!/bin/bash while [ condition ] do 命令 done ``` - for循环 ```shell #!/bin/bash for item in item1 item2 ... itemN do 命令 done ``` ## read读取 - 语法 `read [选项] [参数]`` - | 常用选项 | 功能 | | ---------- | ------------------------ | | -p | 指定读取值时的提示符 | | -t | 指定读取值时等待的时间 | - 案例 ```shell #!/bin/bash #案例1:读取控制台输入一个NUM1值 read -p "请输入一个数NUM1=" NUM1 echo "你输入的NUM1=$NUM1" #案例2:读取控制台输入一个NUM2值,在10秒内输入 read -t 10 -p "请输入一个数NUM2" NUM2 echo "你输入的NUM2=$NUM2" ``` ## 函数 ### 两个系统函数 1. `basename` 返回完整路径最后 / 的部分,用于获取文件名 `basename [pathname] [suffix]` `basename [string] [suffix]` basename命令会删掉所有的前缀包括最后一个"/"字符,然后将字符串显示出来 ```shell [root@localhost ~]# basename /root/hello.sh hello.sh [root@localhost ~]# basename /root/hello.sh .sh hello ``` 2. `dirname` 返回完整路径最后/的前面路径,常用于返回路径部分 `dirname 文件绝对路径` 从给定的包含绝对路径的文件名中取出文件名,然后返回剩下的路径 ```shell [root@localhost ~]# dirname /root/hello.sh /root ``` ## 自定义函数 [菜鸟教程-Shell 函数](https://www.runoob.com/linux/linux-shell-func.html) ```shell [ function ] funname [()] { action; [return int;] } ``` 案例:计算两个输入参数的和 ```shell #!/bin/bash #定义函数getSum function getSum(){ Sum=$[$n1+$n2] echo "和是$SUM" } #输入两个值 read -p "请输入第一个数n1" n1 read -p "请输入第二个数n2" n2 #调用函数 getSum $n1 $n2 ``` ## 数据库备份案例 需求: 1. 每天凌晨2:30备份数据库hspedu到/data/backup/db 2. 备份开始和备份结束能够给出相应的提示信息 3. 备份后的文件要求以备份时间为文件名,并打包成.tar.gz的形式,比如: 2021-03- 12_230201.tar.gz 4. 在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除。 编写shell脚本 ```shell #!/bin/bash #备份目录 BACKUP=/data/backup/db #当前时间 DATETIME=#(date +%Y-%m-%d_%h%M%S) echo $DATETIME #数据库的地址 HOST=localhost #数据库用户名 DB_USER=root #数据库密码 DB_PW=password #备份的数据库名 DATABASE=test #创建备份目录,如果不存在,就创建 [ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}" #备份数据库 mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} -q -R --databases ${DATABASE} | gzip > ${BACKUP}/${DATETIME}/${DATETIME}.sql.gz #将文件处理成tar.gz cd ${BACKUP} tar -zcvf ${DATETIME}.tar.gz ${DATETIME} #删除对应的备份目录 rm -rf ${BACKUP}/${DATETIME} #删除10天前的备份 find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \; echo "备份数据库${DATABASE} 成功" ``` 添加定时任务 ``` 30 2 * * * /usr/sbin/mysql_db_backup.sh ``` 最后修改:2022 年 11 月 26 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏