Linux常用指令合集
Vi / Vim快捷键
拷贝:
yy
, 拷贝当前行向下的 5 行5yy
粘贴:
p
删除:
dd
,删除当前行向下的 5 行5dd
撤销:
u
查找:
/关键字
, 回车 查找 , n 就是查找下一个设置行号:
:set nu
取消行号:
:set nonu
快速定位:最首行【
gg
】 最末行【G
】光标移动:输入 20,再输入 shift+g 即可定位到20行
保存退出:
:wq
不保存退出:
:q
不保存强制退出:
:q!
开机、重启和用户登录注销
关机:
shutdown -h now
halt
一分钟后关机:
shutdown -h 1
重启:
shutdown -r now
reboot
数据同步:
sync
- 不管是重启系统还是关闭系统,首先要运行 sync 命令,把内存中的数据写到磁盘中
- 目前的 shutdown/reboot/halt 等命令均已经在关机前进行了 sync ,但是小心驶得万年船
- 注销用户:
logout
logout 注销指令在图形运行级别无效,在运行级别 3 下有效
用户管理
- 添加用户:
useradd 用户名
useradd -d 指定目录 用户名
当创建用户成功后,会自动的创建和用户同名的家目录,通过
useradd -d
可以给新创建的用户指定家目录
指定/修改密码:
passwd 用户名
删除用户:
userdel 用户名
userdel -r 用户名
userdel
删除用户但是保留家目录,userdel -r
删除用户不保留家目录一般情况下,我们建议保留家目录
- 查看用户:
id 用户名
当用户不存在时,返回无此用户
- 切换用户:
su - 用户名
从权限高的用户切换到权限低的用户,不需要输入密码,反之需要
当需要返回到原来用户时,使用
exit/logout
指令
查看当前用户:
whoami/ who am I
新增组:
groupadd 组名
删除组:
groupdel 组名
给用户分配组:
useradd –g 用户组 用户名
修改用户的组:
usermod –g 用户组 用户名
/etc/passwd
文件:用户(user)的配置文件,记录用户的各种信息每行的含义:用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录 Shell
/etc/shadow
文件:口令的配置文件每行的含义:登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
/etc/group
文件:组(group)的配置文件,记录 Linux 包含的组的信息每行含义:组名:口令:组标识号:组内用户列表
实用指令
运行级别
- 切换运行级别:
init [0,1,2,3,4,5,6]
0 :关机
1 :单用户【找回丢失密码】
2:多用户状态没有网络服务
3:多用户状态有网络服务
4:系统未使用保留给用户
5:图形界面
6:系统重启
常用运行级别是 3 和 5 ,也可以指定默认运行级别
查看当前默认运行级别:
systemctl get-default
设置默认运行级别:
- 3的运行级别:
systemctl set-default multi-user.target
- 5的运行级别:
systemctl set-default graphical.target
- 3的运行级别:
帮助指令
man 获得帮助信息
- 基本语法:
man [命令或配置文件]
- 功能描述:获得帮助信息
查看 ls 命令的帮助信息
man ls
在 linux 下,隐藏文件是以 .开头 , 选项可以组合使用 比如 ls -al, 比如
ls -al /root
help 指令
- 基本语法:
help 命令
- 功能描述:获得 shell 内置命令的帮助信息
文档目录类
pwd 指令
功能描述:显示当前工作目录的绝对路径
基本语法:
pwd
ls 指令
基本语法:
ls [选项] [目录或是文件]
常用选项:
-a
:显示当前目录所有的文件和目录,包括隐藏的。-l
:以列表的方式显示信息-h
:以人更容易理解的方式显示信息
cd 指令
功能描述:切换到指定目录
基本语法:
cd [参数]
cd ~
或者cd
:回到自己的家目录, 比如 你是 root ,cd ~ 到 /root
cd ..
回到当前目录的上一级目录
mkdir 指令
功能描述:创建目录
基本语法:
mkdir [选项] 要创建的目录
常用选项:
-p
:创建多级目录
rmdir 指令
功能描述:删除空目录
基本语法:
rmdir [选项] 要删除的空目录
rmdir
删除的是空目录,如果目录下有内容时无法删除的。提示:如果需要删除非空目录,需要使用
rm -rf 要删除的目录
,比如: rm -rf /home/animal
touch 指令
功能描述:创建空文件
基本语法:
touch 文件名称
cp 指令
功能描述:拷贝文件或目录到指定目录
基本语法:
cp [选项] source dest
常用选项:
-r
:递归复制整个文件夹
案例 1: 将 /home/hello.txt 拷贝到 /home/bbb 目录下
cp hello.txt /home/bbb
案例 2: 递归复制整个文件夹,举例, 比如将 /home/bbb 整个目录, 拷贝到 /opt
cp -r /home/bbb /opt
强制覆盖不提示的方法:\cp ,
\cp -r /home/bbb /opt
rm 指令
功能描述:移除文件或目录
基本语法:
rm [选项] 要删除的文件或目录
常用选项:
-r
:递归删除整个文件夹-f
: 强制删除不提示
强制删除不提示的方法:带上 -f 参数即可
mv 指令
功能描述:移动文件与目录或重命名
基本语法:
- 重命名:
mv oldNameFile newNameFile
- 移动文件:
mv /temp/movefile /targetFolder
- 重命名:
cat 指令
功能描述:查看文件内容
基本语法:
cat [选项] 要查看的文件
常用选项:
-n
:显示行号
cat 只能浏览文件,而不能修改文件,为了浏览方便,一般会带上 管道命令 | more
cat -n /etc/profile | more
[进行交互]
more 指令
功能描述:more 指令是一个基于 VI 编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容
基本语法:
more 要查看的文件
常用选项:
less 指令
功能描述:less 指令用来分屏查看文件内容,它的功能与 more 指令类似,但是比 more 指令更加强大,支持各种显示终端。less 指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于显示大型文件具有较高的效率
基本语法:
less 要查看的文件
常用选项:
echo 指令
- 功能描述:输出内容到控制台
- 基本语法:
echo [选项] [输出内容]
head 指令
功能描述:查看文件头 10 行内容
基本语法:
head 文件
常用选项:
-n num
:查看文件头 num 行内容
查看/etc/profile 的前面 5 行代码
head -n 5 /etc/profile
tail 指令
- 功能描述:用于输出文件中尾部的内容,默认情况下 tail 指令显示文件的前 10 行内容
- 基本语法:
tail 文件
:查看文件尾 10 行内容tail -n 5 文件
:查看文件尾 5 行内容,5 可以是任意行数tail -f 文件
:实时追踪该文档的所有更新
> 指令 和 >> 指令
- 功能描述:
>
输出重定向 ;>>
追加 - 基本语法:
ls -l >文件
:列表的内容写入文件中(覆盖写)ls -al >>文件
:列表的内容追加到文件的末尾cat 文件 1 > 文件 2
:将文件 1 的内容覆盖到文件 2echo "内容">> 文件
:追加
ln 指令
- 功能描述:给原文件创建一个软链接
- 基本语法:
ln -s [原文件或目录] [软链接名]
案例 1: 在/home 目录下创建一个软连接 myroot,连接到 /root 目录
ln -s /root /home/myroot
案例 2: 删除软连接 myroot
rm /home/myroot
当我们使用 pwd 指令查看目录时,仍然看到的是软链接所在目录
history 指令
- 功能描述:查看已经执行过历史命令
- 基本语法:
history
案例 1: 显示所有的历史命令
history
案例 2: 显示最近使用过的 10 个指令。
history 10
案例 3:执行历史编号为 5 的指令
!5
时间日期类
date 指令-显示当前日期
- 功能描述:显示当前日期
- 基本语法:
date
:显示当前时间date +%Y
:显示当前年份date +%m
:显示当前月份date +%d
:示当前是哪一天date "+%Y-%m-%d %H:%M:%S"
:显示年月日时分秒
date 指令-设置日期
- 功能描述:设置日期
- 基本语法:
date -s 字符串时间
案例 1: 设置系统当前时间 , 比如设置成 2021-08-15 11:52:10
date -s “2021-08-15 11:52:10”
cal 指令
- 功能描述:查看日历
- 基本语法:
cal [选项]
:不加选项,显示本月日历
案例 1: 显示当前日历
cal
案例 2: 显示 2021 年日历 :
cal 2021
案例 3: 显示2021年5月份日历 :
cal 5 2021
搜索查找类
find 指令
功能描述:将从指定目录向下递归地遍历其各个子目录,将满足条件的文件或者目录显示在终端
基本语法:
find [搜索范围] [选项]
常用选项:
案例 1: 按文件名:根据名称查找**/home** 目录下的 hello.txt 文件
find /home -name hello.txt
案例 2:按拥有者:查找**/opt** 目录下,用户名称为 nobody 的文件
find /opt -user nobody
案例 3:查找整个 linux 系统下大于 200M 的文件(+n 大于,-n 小于,n 等于, 单位有 k,M,G)
find / -size +200M
locate 指令
- 功能描述:locate 指令可以快速定位文件路径。locate 指令利用事先建立的系统中所有文件名称及路径的 locate 数据库实现快速定位给定的文件。Locate 指令无需遍历整个文件系统,查询速度较快。为了保证查询结果的准确度,管理员必须定期更新 locate 时刻
- 基本语法:
locate 搜索文件
由于 locate 指令基于数据库进行查询,所以第一次运行前,必须使用
updatedb
指令创建 locate 数据库。
which 指令
- 功能描述:可以查看某个指令在哪个目录下
- 基本语法:
which 指令
:
ls 指令在哪个目录
which ls
grep 指令和 管道符号 |
功能描述:grep 过滤查找 , 管道符,“|”,表示将前一个命令的处理结果输出传递给后面的命令处理
基本语法:
grep [选项] 查找内容 源文件
常用选项:
案例 1: 请在 hello.txt 文件中,查找 **”yes”**所在行,并且显示行号
写法 1:
cat /home/hello.txt | grep -n "yes"
写法 2:
grep -n "yes" /home/hello.txt
压缩和解压类
gzip/gunzip 指令
- 功能描述:
gzip
用于压缩文件,gunzip
用于解压的 - 基本语法:
gzip 文件
:压缩文件,只能将文件压缩为*.gz
文件gunzip 文件.gz
:解压缩文件命令
案例 1:
gzip
压缩, 将 /home 下的 hello.txt 文件进行压缩
gzip /home/hello.txt
案例 2:
gunzip
解压缩, 将 /home 下的 hello.txt.gz 文件进行解压缩
gunzip /home/hello.txt.gz
zip/unzip 指令
功能描述:
zip
用于压缩文件,unzip
用于解压的,这个在项目打包发布中很有用的基本语法:
zip [选项] XXX.zip 将要压缩的内容
:压缩文件和目录的命令unzip [选项] XXX.zip
:解压缩文件
zip常用选项:
-r
:递归压缩,即压缩目录
unzip常用选项:
-d<目录>
:指定解压后文件的存放目录
案例1:将 /home 下的 所有文件/文件夹进行压缩成 myhome.zip
zip -r myhome.zip /home/
[将 home 目录及其包含的文件和子文件夹都压缩]案例2: 将 myhome.zip 解压到 /opt/tmp 目录下
mkdir /opt/tmp
unzip -d /opt/tmp /home/myhome.zip
tar 指令
功能描述:tar 指令是打包指令,最后打包后的文件是
.tar.gz
的文件基本语法:
tar [选项] XXX.tar.gz 打包的内容
:打包目录,压缩后的文件格式.tar.gz
常用选项:
案例 1: 压缩多个文件,将 /home/pig.txt 和 /home/cat.txt 压缩成pc.tar.gz
tar -zcvf pc.tar.gz /home/pig.txt /home/cat.txt
案例 2:将**/home** 的文件夹 压缩成 myhome.tar.gz
tar -zcvf myhome.tar.gz /home/
案例 3: 将 pc.tar.gz 解压到当前目录
tar -zxvf pc.tar.gz
案例4: 将myhome.tar.gz 解压到 /opt/tmp2 目录下
mkdir /opt/tmp2
tar -zxvf /home/myhome.tar.gz -C /opt/tmp2
组管理和权限管理
修改文件所有者
- 基本语法:
chown newowner 文件/目录
:改变所有者chown newowner:newgroup 文件/目录
:改变所有者和所在组
- 常用选项:
-R
:如果是目录 则使其下所有子文件或目录递归生效
请将 /home/abc.txt 文件的所有者修改成 tom
chown tom /home/abc.txt
请将 /home/test 目录下所有的文件和目录的所有者都修改成 tom
chown -R tom /home/test
修改文件/目录所在的组
- 基本语法:
chgrp newgroup 文件/目录
- 常用选项:
-R
:如果是目录 则使其下所有子文件或目录递归生效
改变用户所在组
基本语法:
usermod –g 新组名 用户名
usermod –d 目录名 用户名
:改变该用户登陆的初始目录
用户需要有进入到新目录的权限
修改权限
第一种方式:+ 、-、= 变更权限
基本语法:u:所有者;g:所有组;o:其他人;a:所有人(u、g、o 的总和)
chmod u=rwx,g=rx,o=x 文件/目录名
chmod o+w 文件/目录名
chmod a-x 文件/目录名
给 abc 文件 的所有者读写执行的权限,给所在组读执行权限,给其它组读执行权限。
chmod u=rwx,g=rx,o=rx abc
给 abc 文件的所有者除去执行的权限,增加组写的权限
chmod u-x,g+w abc
给 abc 文件的所有用户添加读的权限
chmod a+r abc
第二种方式:通过数字变更权限
- 基本语法:r=4 w=2 x=1 rwx=4+2+1=7
-
chmod 751 文件/目录名
:相当于chmod u=rwx,g=rx,o=x 文件/目录名
-
将 /home/abc.txt 文件的权限修改成
rwxr-xr-x
, 使用给数字的方式实现:
chmod 755 /home/abc.txt
定时任务调度
任务调度:是指系统在某个时间执行的特定的命令或程序。
任务调度分类:1.系统工作:有些重要的工作必须周而复始地执行。如病毒扫描等个别用户工作:个别用户可能希望执行某些程序,比如对 mysql 数据库的备份。
示意图:
crond 任务调度
功能描述:crontab 进行定时任务的设置
基本语法:
crontab [选项]
常用选项:
设置任务调度文件:/etc/crontab
设置个人任务调度。执行 crontab –e 命令。接着输入任务到调度文件
如:
*/1 * * * * ls –l /etc/ > /tmp/to.txt
意思说每小时的每分钟执行
ls –l /etc/ > /tmp/to.txt
命令
- 参数细节说明:
5个占位符的说明
- 特殊符号的说明
- 特殊时间执行案例:
- 应用案例:
- 案例 1:每隔 1 分钟,就将当前的日期信息,追加到 /tmp/mydate 文件中
*/1 * * * * date >> /tmp/mydate
- 案例 2:每隔 1 分钟, 将当前日期和日历都追加到 /home/mycal 文件中步骤:
vim /home/my.sh
写入内容date >> /home/mycal
和cal >> /home/mycal
给 my.sh 增加执行权限,
chmod u+x /home/my.sh
crontab -e
增加*/1 * * * * /home/my.sh
- 案例 3: 每天凌晨 2:00 将 mysql 数据库 testdb ,备份到文件中。提示: 指令为
mysqldump -u root -p 密码 数据库 > /home/db.bak
crontab -e
0 2 * * * mysqldump -u root -proot testdb > /home/db.bak
- crond 相关指令
conrtab –r
:终止任务调度。crontab –l
:列出当前有那些任务调度service crond restart
[重启任务调度]
at 定时任务
- 基本介绍:
at 命令是一次性定时计划任务,at 的守护进程 atd 会以后台模式运行,检查作业队列来运行。
默认情况下,atd 守护进程每 60 秒检查作业队列,有作业时,会检查作业运行时间,如果时间与当前时间匹配,则运行此作业。
at 命令是一次性定时计划任务,执行完一个任务后不再执行此任务了
在使用 at 命令的时候,一定要保证 atd 进程的启动 , 可以使用相关指令来查看
ps -ef | grep atd
//可以检测 atd 是否在运行画一个示意图
at命令格式
at [选项] [时间]
Ctrl + D
结束 at 命令的输入, 输出两次
at命令选项
- at 时间定义
at 指定时间的方法:
接受在当天的 hh:mm(小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。 例如:04:00
使用 midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午 4 点)等比较模糊的词语来指定时间。
采用 12 小时计时制,即在时间后面加上 AM(上午)或 PM(下午)来说明是上午还是下午。 例如:12pm
指定命令执行的具体日期,指定格式为 month day(月 日)或 mm/dd/yy(月/日/年)或 dd.mm.yy(日.月.年),指定的日期必须跟在指定时间的后面。 例如:04:00 2021-03-1
使用相对计时法。指定格式为:now + count time-units ,now 就是当前时间,time-units 是时间单位,这里能够是 minutes(分钟)、hours(小时)、days(天)、weeks(星期)。count 是时间的数量,几天,几小时。 例如:now + 5 minutes
直接使用 today(今天)、tomorrow(明天)来指定完成命令的时间。
- 应用实例
案例 1:2 天后的下午 5 点执行 /bin/ls /home
案例 2:
atq
命令来查看系统中没有执行的工作任务
案例 3:明天 17 点钟,输出时间到指定文件内 比如 /root/date100.log
案例 4:2 分钟后,输出时间到指定文件内 比如 /root/date200.log
案例 5:删除已经设置的任务 , atrm 编号
atrm 2 //表示将 job 队列,编号为 2 的 job 删除
磁盘分区、挂载
Linux分区
原理介绍
- Linux 来说无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构 , Linux中每个分区都是用来组成整个文件系统的一部分
- Linux 采用了一种叫“载入”的处理方法,它的整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录联系起来。这时要载入的一个分区将使它的存储空间在一个目录下获得
- 示意图
硬盘说明
- Linux 硬盘分 IDE 硬盘和 SCSI 硬盘,目前基本上是 SCSI 硬盘
- 对于 IDE 硬盘,驱动器标识符为“hdx~”,其中“hd”表明分区所在设备的类型,这里是指 IDE 硬盘了。“x”为盘号(a 为基本盘,b 为基本从属盘,c 为辅助主盘,d 为辅助从属盘),“~”代表分区,前四个分区用数字 1 到 4 表示,它们是主分区或扩展分区,从 5 开始就是逻辑分区。例,hda3 表示为第一个 IDE 硬盘上的第三个主分区或扩展分区,hdb2 表示为第二个 IDE 硬盘上的第二个主分区或扩展分区
- 对于 SCSI 硬盘则标识为“sdx~”,SCSI 硬盘是用“sd”来表示分区所在设备的类型的,其余则和 IDE 硬盘的表示方法一样
查看所有设备挂在情况
- 命令:
lsblk
lsblk -f
其中
sdax
为分区情况,MOUNTPOINT
为挂载目录
挂载案例
说明
下面我们以增加一块硬盘为例来熟悉下磁盘的相关指令和深入理解磁盘分区、挂载、卸载的概念
如何增加一块硬盘
- 虚拟机添加硬盘
- 分区
- 格式化
- 挂载
- 设置可以自动挂载
虚拟机增加硬盘步骤1
在【虚拟机】菜单中,选择【设置】,然后设备列表里添加硬盘,然后一路【下一步】,中间只有选择磁盘大小的地方需要修改,至到完成。然后重启系统(才能识别)
虚拟机增加硬盘步骤2
- 分区命令:
fdisk /dev/sdb
开始对/sdb
分区
m
:显示命令列表p
:显示磁盘分区 同fdisk –l
n
:新增分区d
:删除分区w
:写入并退出
说明:开始分区后输入
n
,新增分区,然后选择p
,分区类型为主分区。两次回车默认剩余全部空间。最后输入w
写入分区并退出,若不保存退出输入q
虚拟机增加硬盘步骤3
- 格式化磁盘:
mkfs -t ext4 /dev/sdb1
其中
ext4
是分区类型
虚拟机增加硬盘步骤4
- 挂载:将一个分区与一个目录联系起来
- 挂载命令:
mount 设备名称 挂载目录
例如:
mount /dev/sdb1 /newdisk
- 卸载命令:
umount 设备名称
umount 挂载目录
例如:
umount /dev/sdb1
或者umount /newdisk
注意:用命令行挂载,重启后会失效
虚拟机增加硬盘步骤5
永久挂载:通过修改/etc/fstab
实现挂载
- 命令:
vim /etc/fstab
添加完成之后,执行mount –a
即刻生效
其中,后面的第一个数字表示指定文件系统是否需要使用dump进行备份 (0 为不备份,1 为要备份, 一般根分区要备份);第二个数字表示指定文件系统将按照何种顺序来自动检查错误和损坏 (0 -不自检,1 或者 2 -要自检;如果是根分区要设为1,其他分区只能是2)
磁盘情况查询
查询系统整体磁盘使用情况
- 基本语法:
df -h
- 应用实例
查询指定目录的磁盘占用情况
基本语法:
du -h
:查询指定目录的磁盘占用情况,默认为当前目录常用选项:
-s
:指定目录占用大小汇总-h
:带计量单位-a
:含文件--max-depth=1
:子目录深度-c
:列出明细的同时,增加汇总值
应用实例:查询 /opt 目录的磁盘占用情况,深度为
磁盘情况-工作实用指令
- 统计/opt 文件夹下文件的个数
ls -l /opt | grep "^-" | wc -l
统计/opt 文件夹下目录的个数
ls -l /opt | grep "^d" | wc -l
- 统计/opt 文件夹下文件的个数,包括子文件夹里的
ls -lR /opt | grep "^-" | wc -l
- 统计/opt 文件夹下目录的个数,包括子文件夹里的
ls -lR /opt | grep "^d" | wc -l
- 以树状显示目录结构 tree 目录 , 注意,如果没有 tree ,则使用 yum install tree 安装
网络配置
原理图
查看网络IP和网关
查看虚拟网络编辑器和修改IP 地址
VMware:编辑—>虚拟网络编辑器
查看网关
查看 windows 环境的中 VMnet8 网络配置 (ipconfig 指令)
查看 linux 的网络配置 ifconfig
ping 测试主机之间网络连通性
基本语法
ping 目的主机 (功能描述:测试当前服务器是否可以连接目的主机)
应用实例
测试当前服务器是否可以连接百度
ping www.baidu.com
linux 网络环境配置
第一种方法(自动获取)
说明:登陆后,通过界面的来设置自动获取ip,特点:linux 启动后会自动获取 IP,缺点是每次自动获取的 ip 地址可能不一样
第二种方法(指定ip)
- 说明:直接修改配置文件来指定 IP,并可以连接到外网(程序员推荐)
1 | # 编辑网络配置文件 |
- 修改ip地址为静态
1 | # IP 的配置方法[none|static|bootp|dhcp](引导时不使用协议|静态分配 IP|BOOTP 协议|DHCP 协议) |
设置主机名和hosts 映射
设置主机名
为了方便记忆,可以给 linux 系统设置主机名, 也可以根据需要修改主机名
- 指令:
hostname
:查看主机名
修改文件在 /etc/hostname 指定
修改后,重启生效
设置hosts 映射
- windows:在 C:\Windows\System32\drivers\etc\hosts 文件指定即可
案例: 192.168.200.130 caicai
linux:在 /etc/hosts 文件 指定
案例: 192.168.200.1 myWindows
主机名解析过程分析(Hosts、DNS)
Hosts是什么
一个文本文件,用来记录 IP 和 **Hostname(主机名)**的映射关系
DNS
DNS,就是 Domain Name System 的缩写,翻译过来就是域名系统是互联网上作为域名和 IP 地址相互映射的一个分布式数据库
应用实例:用户在浏览器输入了www.baidu.com
- 浏览器先检查浏览器缓存中有没有该域名解析 IP 地址,有就先调用这个 IP 完成解析;如果没有,就检查 DNS 解析器缓存,如果有直接返回 IP 完成解析。这两个缓存,可以理解为本地解析器缓存
- 一般来说,当电脑第一次成功访问某一网站后,在一定时间内,浏览器或操作系统会缓存他的 IP 地址(DNS 解析记录).如 在 cmd 窗口中输入
1 | ipconfig /displaydns #DNS 域名解析缓存 |
如果本地解析器缓存没有找到对应映射,检查系统中
hosts
文件中有没有配置对应的域名 IP 映射,如果有,则完成解析并返回如果本地
DNS
解析器缓存和hosts
文件中均没有找到对应的 IP,则到域名服务DNS进行解析域示意图
进程管理
基本介绍
- 在 LINUX 中,每个执行的程序都称为一个进程。每一个进程都分配一个 ID 号(pid,进程号)。
- 每个进程都可能以两种方式存在的。前台与后台,所谓前台进程就是用户目前的屏幕上可以进行操作的。后台进程则是实际在操作,但由于屏幕上无法看到的进程,通常使用后台方式执行
- 一般系统的服务都是以后台进程的方式存在,而且都会常驻在系统中。直到关机才才结束
- 示意图:
显示系统执行的进程
基本介绍
ps
命令是用来查看目前系统中,有哪些正在执行,以及它们执行的状况。可以不加任何参数
- 常用参数:
-a
:显示当前终端的所有进程信息-u
:以用户的格式显示进程信息-x
:显示后台进程运行的参数
ps详解
- 指令:
ps -aux|grep xxx
: - 指令说明:
- System V 展示风格
- USER:用户名称
- PID:进程号
- %CPU:进程占用 CPU 的百分比
- %MEM:进程占用物理内存的百分比
- VSZ:进程占用的虚拟内存大小(单位:KB)
- RSS:进程占用的物理内存大小(单位:KB)
- TT:终端名称,缩写 .
- STAT:进程状态,其中 S-睡眠,s-表示该进程是会话的先导进程,N-表示进程拥有比普通优先级更低的优先级,R-正在运行,D-短期等待,Z-僵死进程,T-被跟踪或者被停止等等
- STARTED:进程的启动时间
- TIME:CPU 时间,即进程使用 CPU 的总时间
- COMMAND:启动进程所用的命令和参数,如果过长会被截断显示
应用实例
要求:以全格式显示当前所有的进程,查看进程的父进程。 查看 sshd 的父进程信息
ps -ef
是以全格式显示当前所有的进程
-e
显示所有进程。-f
全格式
1 | ps -ef|grep sshd |
- UID:用户ID
- PID:进程ID
- PPID:父进程ID
- C:CPU 用于计算执行优先级的因子。数值越大,表明进程是 CPU 密集型运算,执行优先级会降低;数值越小,表明进程是 I/O 密集型运算,执行优先级会提高
- STIME:进程启动的时间
- TTY:完整的终端名称
- TIME:CPU 时间
- CMD:启动进程所用的命令和参数
终止进程kill和killall
介绍
若是某个进程执行一半需要停止时,或是已消了很大的系统资源时,此时可以考虑停止该进程。使用 kill 命令来完成此项任务
基本语法
kill [选项] 进程号
:通过进程号杀死/终止进程killall 进程名称
:通过进程名称杀死进程,也支持通配符,这在系统因负载过大而变得很慢时很有用
常用选项
-9
:表示强迫进程立即停止
最佳实践
案例 1:踢掉某个非法登录用户
1 | # kill 进程号 |
案例 2: 终止远程登录服务 sshd, 在适当时候再次重启 sshd 服务
1 | # 终止远程登录服务 |
案例 3: 终止多个 gedit
1 | killall gedit |
案例 4:强制杀掉一个终端
1 | kill -9 bash对应的进程号 |
查看进程树 pstree
基本语法
pstree [选项]
:可以更加直观的来看进程信息
常用选项
-p
:显示进程的PID-u
:显示进程的所属用户
应用实例
案例 1:请你树状的形式显示进程的 pid
1 | pstree -p |
案例 2:请你树状的形式进程的用户
1 | pstree -u |
服务(service)管理
介绍
服务(service) 本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它程序的请求,比如(mysqld , sshd,防火墙等),因此我们又称为守护进程,是 Linux 中非常重要的知识点
service 管理指令
service 服务名 [start | stop | restart | reload | status]
- 在 CentOS7.0 后 (我的是7.6),很多服务不再使用 service ,而是 systemctl (后面专门讲)
- service 指令管理的服务在
/etc/init.d
查看
service管理指令案例
使用 service 指令,查看,关闭,启动 network [注意:在虚拟系统演示,因为网络连接会关闭]
1 | # 查看 |
查看服务名
- 方式一:使用 setup -> 系统服务 就可以看到全部
1 | setup |
*表示开机自启动
- 方式二:
/etc/init.d
看到 service 指令管理的服务
1 | ls -l /etc/init.d |
服务的运行级别(runlevel)
Linux 系统有 7 种运行级别(runlevel):常用的是级别 3 和 5
- 运行级别 0:系统停机状态,系统默认运行级别不能设为 0,否则不能正常启动运行级别 1:单用户工作状态,root 权限,用于系统维护,禁止远程登陆
- 运行级别 2:多用户状态(没有 NFS),不支持网络
- 运行级别 3:完全的多用户状态(有 NFS),无界面,登陆后进入控制台命令行模式
- 运行级别 4:系统未使用,保留
- 运行级别 5:X11 控制台,登陆后进入图形 GUI 模式
- 运行级别 6:系统正常关闭并重启,默认运行级别不能设为 6,否则不能正常启动
开机流程说明:
CentOS7 后运行级别说明
在 /etc/inittab
中
1 | cat /etc/inittab |
chkconfig 指令
通过 chkconfig 命令可以给服务的各个运行级别设置自 启动/关闭
chkconfig 指令管理的服务在 /etc/init.d 查看
注意: Centos7.0 后,很多服务使用 systemctl 管理
基本语法:
chkconfig [服务名] --list [| grep xxx]
:查看服务chkconfig --level 5 服务名 on/off
:设置服务在5运行级别的自启动
案例演示:对 network 服务 进行各种操作, 把 network 在 3 运行级别,关闭自启动
1 | chkconfig --level 3 network off |
chkconfig
重新设置服务后自启动或关闭,需要重启机器reboot
生效
systemctl 管理指令
- 基本语法:
systemctl [start | stop | restart | status] 服务名
systemctl 指令管理的服务在 /usr/lib/systemd/system 查看
systemctl 设置服务的自启动状态
1 | # 查看服务开机启动状态, grep 可以进行过滤 |
应用实例
查看当前防火墙的状况,关闭防火墙和重启防火墙。=> firewalld.service
1 | # 查看 |
细节讨论
关闭或者启用防火墙后,立即生效。[telnet 测试 某个端口即可]
1 | # 在windows上,测试111端口 |
这种方式只是临时生效,当重启系统后,还是回归以前对服务的设置。
如果希望设置某个服务自启动或关闭永久生效,要使用 systemctl [enable|disable] 服务名
打开或者关闭指定端口
在真正的生产环境,往往需要将防火墙打开,但问题来了,如果我们把防火墙打开,那么外部请求数据包就不能跟服务器监听端口通讯。这时,需要打开指定的端口。比如 80、22、8080 等
firewall 指令
打开端口:
firewall-cmd --permanent --add-port=端口号/协议
关闭端口:
firewall-cmd --permanent --remove-port=端口号/协议
重新载入才能生效:
firewall-cmd --reload
查询端口是否开放:
firewall-cmd --query-port=端口/协议
应用案例
- 启动防火墙,测试111端口是否能telnet:不可以
- 开放111端口
1 | firewall-cmd --permanent --add-port=111/tcp |
- 再次关闭111端口
1 | firewall-cmd --permanent --remove-port=111/tcp |
动态监控进程
介绍
top 与 ps 命令很相似。它们都用来显示正在执行的进程。Top 与 ps 最大的不同之处,在于 top 在执行一段时间可以更新正在运行的的进程
基本语法
1 | top [选项] |
选项说明
交互操作说明
应用实例
- 案例 1.监视特定用户, 比如我们监控 tom 用户
top:输入top命令,按回车键,查看执行的进程
u:然后输入“u”回车,再输入用户名,即可
- 案例 2:终止指定的进程, 比如我们要结束 tom 登录
top:输入此命令,按回车键,查看执行的进程
k:然后输入“k”回车,再输入要结束的进程 ID 号
- 案例 3:指定系统状态更新的时间(每隔 10 秒自动更新), 默认是 3 秒
top -d 10
监控网络状态
查看系统网络情况netstat
基本语法:
netstat [选项]
选项说明:
-an
:按一定顺序排列输出-p
:显示哪个进程在调用
应用案例
请查看服务名为 sshd 的服务的信息
1 | netstat -anp | grep sshd |
检测主机连接命令 ping
是一种网络检测工具,它主要是用检测远程主机是否正常,或是两部主机间的网线或网卡故障。如: ping 对方 ip 地址
RPM 与 YUM
rpm包的管理
介绍
rpm 用于互联网下载包的打包及安装工具,它包含在某些 Linux 分发版中。它生成具有.RPM 扩展名的文件。RPM 是 RedHat Package Manager(RedHat 软件包管理工具)的缩写,类似 windows 的setup.exe,这一文件格式名称虽然打上了 RedHat 的标志,但理念是通用的。
Linux 的分发版本都有采用(suse,redhat, centos 等等),可以算是公认的行业标准了。
rpm 包的简单查询指令
- 查询已安装的rpm列表:
rpm -qa | grep xx
举例:查看当前系统是否安装了firefox
rpm -qa | grep firefox
rpm包名基本格式
一个 rpm 包名:firefox-60.2.2-1.el7.centos.x86_64
版本号:60.2.2-1
适用操作系统: el7.centos.x86_64
x86_64表示 centos7.x 的 64 位系统,如果是 i686、i386 表示 32 位系统,noarch 表示通用
rpm包的其他查询指令
- 查询所安装的所有 rpm 软件包:
rpm -qa
rpm -qa | more
rpm -qa | grep X [rpm -qa | grep firefox ]
查询软件包是否安装:
rpm -q 软件包名
查询软件包信息:
rpm -qi 软件包名
案例:
rpm -qi firefox
- 查询软件包中的文件:
rpm -ql
rpm -ql firefox
- 查询文件所属的软件包:
rpm -qf 文件全路径名
rpm -qf /etc/passwd
rpm -qf /root/install.log
卸载rpm包
基本语法:
rpm -e RPM包的名称
应用案例:
删除 firefox 软件包
rpm -e firefox
- 细节讨论
- 如果其它软件包依赖于您要卸载的软件包,卸载时则会产生错误信息。
如:
$ rpm -e foo
removing these packages would break dependencies:foo is needed by bar-1.0-1
如果我们就是要删除 foo 这个 rpm 包,可以增加参数 –nodeps ,就可以强制删除,但是一般不推荐这样做,因为依赖于该软件包的程序可能无法运行
如:
$ rpm -e --nodeps foo
安装rpm包
基本语法:
rpm -ivh RPM 包全路径名称
参数说明:
i=install
: 安装v=verbose
: 提示h=hash
: 进度条
应用实例
演示卸载和安装 firefox 浏览器
rpm -e firefox
rpm -ivh firefox
yum
介绍
Yum 是一个 Shell 前端软件包管理器。基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包
yum的基本指令
查询 yum 服务器是否有需要安装的软件
yum list|grep xx
安装指定的yum包
yum install xxx
yum应用实例
案例:请使用 yum 的方式来安装 firefox
rpm -e firefox
yum list | grep firefox
yum install firefox
Shell编程
为什么要学Shell编程
Linux 运维工程师在进行服务器集群管理时,需要编写 Shell 程序来进行服务器管理。
对于 JavaEE 和 Python 程序员来说,工作的需要,你的老大会要求你编写一些 Shell 脚本进行程序或者是服务器的维护,比如编写一个定时备份数据库的脚本。
对于大数据程序员来说,需要编写 Shell 程序来管理集群
Shell是什么
Shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序。看一个示意图
Shell脚本的执行方式
脚本格式要求
- 脚本以
#!/bin/bash
开头 - 脚本需要有可执行权限
编写第一个Shell 脚本
- 需求说明:创建一个shell脚本,输出
hello world!
1 | vim hello.sh |
脚本的常用执行方式
- 方式1(输入脚本的绝对路径或相对路径)
说明:首先要赋予 helloworld.sh 脚本的+x 权限, 再执行脚本
比如:
./hello.sh
或者使用绝对路径/root/shcode/hello.sh
- 方式2(sh+脚本)
说明:不用赋予脚本+x 权限,直接执行即可。
比如:
sh hello.sh
, 也可以使用绝对路径
Shell的变量
Shell变量介绍
Linux Shell 中的变量分为,系统变量和用户自定义变量。
系统变量:
$HOME
、$PWD
、$SHELL
、$USER
等等,比如:echo $HOME
等等..显示当前 shell 中所有变量:
set
Shell变量的定义
基本语法
- 定义变量:
变量名=值
- 撤销变量:
unset 变量
- 声明静态变量:
readonly 变量
,注意:不能 unset
- 定义变量:
快速入门
- 案例1:定义变量A
- 案例2:撤销变量A
- 案例3:生命静态的变量B=2,不能unset
- 案例4:可把变量提升为全局环境变量,可供其他 shell 程序使用[该案例后面讲]
1 | !/bin/bash |
shell变量的定义
- 定义变量的规则
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。5A=200(❌)
- 等号两侧不能有空格(一定要注意)
- 变量名称一般习惯为大写, 这是一个规范,我们遵守即可
- 将命令的返回值赋给变量
- A=`date`:反引号,运行里面的命令,并把结果返回给变量 A
- A=$(date) :等价于反引号
设置环境变量
基本语法
export 变量名=变量值
(功能描述:将 shell 变量输出为环境变量/全局变量)source 配置文件
(功能描述:让修改后的配置信息立即生效)echo $变量名
(功能描述:查询环境变量的值)
快速入门
在
/etc/profile
文件中定义TOMCAT_HOME
环境变量查看环境变量
TOMCAT_HOME
的值
注意:在输出 TOMCAT_HOME 环境变量前,需要让其生效
source /etc/profile
shell 脚本的多行注释
:<<! 内容 !
位置参数变量
介绍
我们执行一个 shell 脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量
比如:./myshell.sh 100 200
, 这个就是一个执行 shell 的命令行,可以在myshell
脚本中获取到参数信息
基本语法
- $n (功能描述:n 为数字,$0 代表命令本身,$1-$9 代表第一到第九个参数,十以上的参数需要用大括号包含,如${10})
- $* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
- **$@**(功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
- **$#**(功能描述:这个变量代表命令行中所有参数的个数)
位置参数变量
案例:编写一个 shell 脚本 position.sh
, 在脚本中获取到命令行的各个参数信息
1 | !/bin/bash |
预定义变量
基本介绍
就是 shell 设计者事先已经定义好的变量,可以直接在 shell 脚本中使用
基本语法
$$ (功能描述:当前进程的进程号(PID))
$! (功能描述:后台运行的最后一个进程的进程号(PID))
$?(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
应用实例
在一个 shell 脚本中简单使用一下预定义变量
test.sh
1 | !/bin/bash |
运算符
基本语法
“$((运算式))”或“$[运算式]”或者 expr m + n //expression 表达式
注意 expr 运算符间要有空格, 如果希望将 expr 的结果赋给某个变量,使用 ``
expr m - n
expr \*, /, % 乘,除,取余
应用实例
案例1:计算(2+3)X4 的值
案例2:求出命令行的两个参数[整数]的和20 50
1 | !/bin/bash |
条件判断
判断语句
- 基本语法
[ condition ]
(注意 condition 前后要有空格)#非空返回 true,可使用$?验证(0 为 true,>1 为 false)
- 应用实例
[ caicai ]
返回 true
[ ]
返回 false
[ condition ] && echo OK || echo notok
条件满足,执行后面的语句
- 判断语句
=
字符串比较- 两个整数的比较
-lt
小于-le
小于等于 little equal-eq
等于-gt
大于-ge
大于等于-ne
不等于
- 按照文件权限进行判断
-r
有读的权限-w
有写的权限-x
有执行的权限
- 按照文件类型进行判断
-f
文件存在并且是一个常规的文件-e
文件存在-d
文件存在并是一个目录
- 应用实例
案例 1:”ok”是否等于”ok”
判断语句:使用
=
案例 2:23 是否大于等于 22
判断语句:使用
-ge
案例 3:/root/shcode/aaa.txt 目录中的文件是否存在
判断语句: 使用
-f
代码如下
1 | !/bin/bash |
流程控制
if 判断
- 基本语法
1 | 单分支 |
注意事项:[ 条件判断式 ],中括号和条件判断式之间必须有空格
- 应用实例
案例:请编写一个 shell 程序,如果输入的参数,大于等于 60,则输出 “及格了”,如果小于 60,则输出 “不及格”
1 | !/bin/bash |
case 语句
- 基本语法
1 | case $变量名 in |
- 应用实例
案例 1 :当命令行参数是 1 时,输出 “周一”, 是 2 时,就输出”周二”, 其它情况输出 “other”
1 | !/bin/bash |
for 循环
- 基本语法1
1 | for 变量 in 值 1 值 2 值 3… |
- 应用实例
案例 1 :打印命令行输入的参数 [这里可以看出$* 和 $@ 的区别]
1 | !/bin/bash |
- 基本语法2
1 | for (( 初始值;循环控制条件;变量变化 )) |
- 应用实例
案例 1 :从 1 加到 100 的值输出显示
1 | !/bin/bash |
注意:SUM=0,赋值符号两边不能有空格
while 循环
- 基本语法1
1 | while [ 条件判断式 ] |
注意:while 和 [有空格,条件判断式和 [也有空格
- 应用实例
案例 1 :从命令行输入一个数 n,统计从 1+..+ n 的值是多少
1 | !/bin/bash |
read 读取控制台输入
基本语法:
read(选项)(参数)
选项:
-p
:指定读取值时的提示符-t
:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了
参数:
- 变量:指定读取值的变量名
应用实例
案例 1:读取控制台输入一个 NUM1 值
案例 2:读取控制台输入一个 NUM2 值,在 10 秒内输入
1 | !/bin/bash |
函数
函数介绍
shell 编程和其它编程语言一样,有系统函数,也可以自定义函数。系统函数中,我们这里就介绍两个
系统函数
basename 基本语法
功能:返回完整路径最后
/
的部分,常用于获取文件名语法:
basename [pathname] [suffix]
basename [string] [suffix]
:(功能描述:basename 命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来)
选项:suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉
应用实例
案例 1:请返回 /home/aaa/test.txt 的 “test.txt” 部分
1 | basename /home/aaa/test.txt |
dirname 基本语法
功能:返回完整路径最后 / 的前面的部分,常用于返回路径部分
语法:
dirname 文件绝对路径
(功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))应用实例
案例 1:请返回 /home/aaa/test.txt 的 /home/aaa
1 | dirname /home/aaa/test.txt |
自定义函数
- 基本语法
1 | [ function ] funname[()] |
- 应用实例
案例 1:计算输入两个参数的和(动态的获取), getSum
1 | !/bin/bash |
Shell 编程综合案例
需求分析
每天凌晨 2:30 备份 数据库 caicai到 /data/backup/db
备份开始和备份结束能够给出相应的提示信息
备份后的文件要求以备份时间为文件名,并打包成 .tar.gz 的形式,比如:2021-08-30_230101.tar.gz
在备份的同时,检查是否有 10 天前备份的数据库文件,如果有就将其删除。
代码 /usr/sbin/mysql_db.backup.sh
1 | !/bin/bash |
日志管理
基本介绍
- 日志文件是重要的系统信息文件,其中记录了许多重要的系统事件,包括用户的登录信息、系统的启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等。
- 日志对于安全来说也很重要,它记录了系统每天发生的各种事情,通过日志来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹。
- 可以这样理解 日志是用来记录重大事件的工具
系统常用的日志
/var/log/
目录就是系统日志文件的保存位置,看张图
- 系统常用的日志
日志文件 | 说明 |
---|---|
/var/log/boot.log |
系统启动日志 |
/var/log/cron |
记录与系统定时任务相关的日志 |
/var/log/cups |
记录打印信息的日志 |
/var/log/dmesg |
记录了系统在开机时内核自检的信总。也可以使用dmesg 命令直接查看内核自检信息 |
/var/log/btmp |
记录错误登录的日志,这个文件是二进制文件,不能直接用Vi查看,而要使用lastb命令查看。命令如下:[root@caicai log]#lastb |
/var/log/lasllog |
记录系统中所有用户最后一次的登录时间的日志,这个文件也是二进制文件,要使用lastlog 命令查看 |
/var/log/mailog |
记录邮件信息的日志 |
/var/log/message |
记录系统重要消息的日志,这个日志文件会记录Linux系统的绝大多数重要信息。如果系统出现问题,首先要检查的应该就是这个日志文件 |
/var/log/secure |
记录验证和授权方面的信息,只要涉及账户和密码的程序都会记录,比如系统的登录、ssh的登录、su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中 |
/var/log/wtmp |
永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机时间。是二进制文件,要使用last 命令 |
/var/log/ulmp |
记录当前已经登录的用户的信息,这个文件会随着用户的登录和注销而不断变化,只记录当前登录用户的信息,这个文件不能用Vi查看,而要使用w、who、users等命令查看 |
- 应用案例
使用 root 用户通过 xshell6 登陆, 第一次使用错误的密码,第二次使用正确的密码登录成功看看在日志文件/var/log/secure 里有没有记录相关信息
日志管理服务 rsyslogd
CentOS7.6 日志服务是 rsyslogd , CentOS6.x 日志服务是 syslogd 。rsyslogd 功能更强大。rsyslogd 的使用、日志文件的格式,和 syslogd 服务兼容的。原理示意图
- 查询Linux中的rsyslogd 服务是否启动
1 | ps aux | grep "rsyslog" | grep -v "grep" |
- 查询rsyslogd 服务的自启动状态
1 | systemctl list-unit-files | grep rsyslog |
- 配置文件:
/etc/rsyslog.conf
编辑文件时的格式为: *.* 存放日志文件
其中第一个*代表日志类型,第二个*代表日志级别
- 日志类型分为:
类型 | 说明 |
---|---|
auth | pam 产生的日志 |
authpriv | ssh、ftp 等登录信息的验证信息 |
corn | 时间任务相关 |
kern | 内核 |
lpr | 打印 |
邮件 | |
mark(syslog)-rsyslog | 服务内部的信息,时间标识 |
news | 新闻组 |
user | 用户程序产生的相关信息 |
uucp | unix to nuix copy 主机之间相关的通信 |
local 1-7 | 自定义的日志设备 |
- 日志级别分类:
类型 | 说明 |
---|---|
debug | 有调试信息的,日志通信最多 |
info | 一般信息日志,最常用 |
notice | 最具有重要性的普通条件的信息 |
warning | 警告级别 |
err | 错误级别,阻止某个功能或者模块不能正常工作的信息 |
crit | 严重级别,阻止整个系统或者整个软件不能正常工作的信息 |
alert | 需要立刻修改的信息 |
emerg | 内核崩溃等重要信息 |
none | 什么都不记录 |
注意:从上到下,级别从低到高,记录信息越来越少
- 由日志服务 rsyslogd 记录的日志文件,日志文件的格式包含以下 4 列:
- 事件产生的时间
- 产生事件的服务器的主机名
- 产生事件的服务名或程序名
- 事件的具体信息
日志轮替
基本介绍
日志轮替就是把旧的日志文件移动并改名,同时建立新的空日志文件,当旧日志文件超出保存的范围之后,就会进行删除
日志轮替文件命名
centos7 使用 logrotate 进行日志轮替管理,要想改变日志轮替文件名字,通过 /etc/logrotate.conf 配置文件中“dateext” 参数
如果配置文件中有“dateext”参数,那么日志会用日期来作为日志文件的后缀,例如 “secure-20201010”。这样日志文件名不会重叠,也就不需要日志文件的改名, 只需要指定保存日志个数,删除多余的日志文件即可
如果配置文件中没有“dateext”参数,日志文件就需要进行改名了。当第一次进行日志轮替时,当前的“secure”日志会自动改名为“secure.1”,然后新建“secure”日志, 用来保存新的日志。当第二次进行日志轮替时,“secure.1” 会自动改名为“secure.2”, 当前的“secure”日志会自动改名为“secure.1”,然后也会新建“secure”日志,用来保存新的日志,以此类推
logrotate 配置文件
/etc/logrotate.conf
为 logrotate 的全局配置文件
1 | # rotate log files weekly, 每周对日志文件进行一次轮替 |
- 参数说明:
参数 | 参数说明 |
---|---|
daily | 日志的轮替周期是每天 |
weekly | 日志的轮替周期是每周 |
monthly | 日志的轮替周期是每月 |
rotate 数字 | 保留的日志文件的个数。0 指没有备份 |
compress | 日志轮替时,旧的日志进行压缩 |
create mode owner group | 建立新日志,同时指定新日志的权限与所有者和所属组 |
mail address | 当日志轮替时,输出内容通过邮件发送到指定的邮件地址 |
missingok | 如果日志不存在,则忽略该日志的警告信息 |
notifempty | 如果日志为空文件,则不进行日志轮替 |
minsize 大小 | 日志轮替的最小值。也就是日志一定要达到这个最小值才会轮替,否则就算时间达到也不轮替 |
size 大小 | 日志只有大于指定大小才进行日志轮替,而不是按照时间轮替 |
dateext | 使用日期作为日志轮替文件的后缀 |
sharedscripts | 在此关键字之后的脚本只执行一次 |
prerotate/endscript | 在日志轮替之前执行脚本命令 |
postrotate/endscript | 在日志轮替之后执行脚本命令 |
把自己的日志加入到日志轮替
- 第一种方法是直接在/etc/logrotate.conf 配置文件中写入该日志的轮替策略
- 第二种方法是在/etc/logrotate.d/目录中新建立该日志的轮替文件,在该轮替文件中写入正确的轮替策略,因为该目录中的文件都会被“include”到主配置文件中,所以也可以把日志加入轮替。
- 推荐使用第二种方法,因为系统中需要轮替的日志非常多,如果全都直接写 入/etc/logrotate.conf 配置文件,那么这个文件的可管理性就会非常差,不利于此文件的维护
- 在/etc/logrotate.d/ 配置轮替文件一览
应用实例
看一个案例, 在/etc/logrotate.conf 进行配置, 或者直接在 /etc/logrotate.d/ 下创建文件 cailog 编写如下内容, 具体轮替的效果 可以参考 /var/log 下的 boot.log 情况
1 | /var/log/cai.log |
日志轮替机制原理
日志轮替之所以可以在指定的时间备份日志,是依赖系统定时任务。在 /etc/cron.daily/目录,就会发现这个目录中是有 logrotate 文件(可执行),logrotate 通过这个文件依赖定时任务执行的
查看内存日志
1 | journalctl #可以查看内存日志, 这里我们看看常用的指令 |
注意: journalctl 查看的是内存日志, 重启清空
备份与恢复
基本介绍
实体机无法做快照,如果系统出现异常或者数据损坏,后果严重, 要重做系统,还会造成数据丢失。所以我们可以使用备份和恢复技术
linux 的备份和恢复很简单 , 有两种方式:
- 把需要的文件(或者分区)用 TAR 打包就行,下次需要恢复的时候,再解压开覆盖即可
- 使用 dump 和 restore 命令