一、Linux 概述

简介

Linux 内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的。

Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。

Linux 能运行主要的 UNIX 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

发行版

目前市面上较知名的发行版有:Ubuntu、RedHat、CentOS、Debian、Fedora、SuSE、OpenSUSE、Arch Linux、SolusOS 等。

应用领域

今天各种场合都有使用各种 Linux 发行版,从嵌入式设备到超级计算机,并且在服务器领域确定了地位,通常服务器使用 LAMP(Linux + Apache + MySQL + PHP)或 LNMP(Linux + Nginx+ MySQL + PHP)组合。

目前 Linux 不仅在家庭与企业中使用,并且在政府中也很受欢迎。

  • 巴西联邦政府由于支持 Linux 而世界闻名。
  • 有新闻报道俄罗斯军队自己制造的 Linux 发布版的,做为 G.H.ost 项目已经取得成果。
  • 印度的 Kerala 联邦计划在向全联邦的高中推广使用 Linux。
  • 中华人民共和国为取得技术独立,在龙芯处理器中排他性地使用 Linux。
  • 在西班牙的一些地区开发了自己的 Linux 发布版,并且在政府与教育领域广泛使用,如 Extremadura 地区的 gnuLinEx 和 Andalusia 地区的 Guadalinex。
  • 葡萄牙同样使用自己的 Linux 发布版 Caixa Mágica,用于 Magalh?es 笔记本电脑和 e-escola 政府软件。
  • 法国和德国同样开始逐步采用 Linux。

Linux 系统结构

Linux 系统结构分为内核、Shell、应用程序三个层次

  1. 内核层
    Linux 系统的核心部分,负责系统中硬件设备管理、文件系统、内存管理和进程管理等核心任务。Linux 内核设计了良好的模块化结构,可以动态地加载和卸载内核模块,使得内核可以兼容各种硬件设备和外围设备。
  2. Shell 层
    Shell 是 Linux 系统的命令行解释器,负责将用户输入的命令解释并执行。最常用的是 Bash Shell,Bash Shell 提供了丰富的功能,例如通配符、重定向、管道、变量等。
  3. 应用层
    Linux 系统的各种应用程序和服务,包括文本编辑器、图形界面、Web 服务器、邮件服务器、数据库服务器等。

系统结构图:

二、环境搭建

本地

环境:

  • 虚拟机:VMware Workstation 17
  • Linux:CentOS 7

下载地址:

VMware 创建一个虚拟机,配置如下:

设置 CentOS 的路径

开启虚拟机测试,出现以下界面就成功了,然后 install 即可。

远程

Xshell

Xshell 是一款强大的 SSH、TELNET 和 RLOGIN终端仿真软件,适用于 Windows 用户安全地访问 UNIX/Linux 主机。

安装 Xshell 7之后,就可以访问我们的 Linux 主机了。

新建会话,配置如下:

  1. 配置主机 ip(在 linux 终端中执行 ifconfig 命令可以查看)
    名称随意,主机必须对应。

  2. 配置用户(与 linux 中用户对应)
    密码可以先不填,之后连接时会提示输入密码。

Xftp

Xftp是一个功能强大的 SFTP、FTP 文件传输软件。 使用了 Xftp 以后,MS Windows 用户能安全地在 UNIX/Linux 和 Windows PC 之间传输文件。

新建会话与 Xshell 类似:

三、磁盘管理

Linux 中,使用一个文档树来组织所有资源,根目录以一个斜杠 / 表示(与 Windows 中 C 盘、D 盘…的结构不一样)。

pwd:查看当前所在位置

clean:清屏

ls:列出子文件(list)

  • 无参,只显示名字

  • -a,显示当前位置下的所有子文件或子目录以及隐藏子文件或子目录(linux 下,所有以点 . 开头的都是隐藏的)

  • -l,列出更详细的信息

    第一列:d 表示目录,减号 - 表示文件。

    第二列:例如 rwxr-xr-x,文件权限描述信息。

    第三列:数字,表示当前目录下有几个直接的子目录。

    第四列:例如 root,目录或文件的拥有者。

    第五列:例如 root,组的名字,表示属于哪个组。

    第七列:例如 3月 18 15:52,最后修改时间。

    第八列:例如 公共,文件名。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    -rw-------. 1 root root 1726 3月  18 14:30 anaconda-ks.cfg
    -rw-r--r--. 1 root root 1774 3月 18 14:31 initial-setup-ks.cfg
    -rw-r--r--. 1 root root 6 3月 18 18:15 test.txt
    drwxr-xr-x. 2 root root 4096 3月 18 15:52 公共
    drwxr-xr-x. 2 root root 4096 3月 18 15:52 模板
    drwxr-xr-x. 2 root root 4096 3月 18 15:52 视频
    drwxr-xr-x. 2 root root 4096 3月 18 15:52 图片
    drwxr-xr-x. 2 root root 4096 3月 18 15:52 文档
    drwxr-xr-x. 2 root root 4096 3月 18 15:52 下载
    drwxr-xr-x. 2 root root 4096 3月 18 15:52 音乐
    drwxr-xr-x. 2 root root 4096 3月 18 15:52 桌面
  • -al,-a 和 -l 的组合

cd:切换目录(change directory)

  • cd .. 回到上级目录
  • cd / 回到根目录
  • 绝对路径以 / 开头,相对路径没有 /

vi 和 vim

什么是 vi?

  • vi 是 Linux 操作系统提供的一个编辑器。
  • 可以把 vi 看作专门编辑文件的软件。

vi 编辑器的使用:

  1. vi 文件路径 使用 vi 编辑器打开文件。
  2. 输入 i 命令(Insert),切换到编辑模式。
    • vi 编辑器为用户准备了两种模式:命令行模式和编辑模式
    • 使用 vi 刚打开文件时,编辑器处于命令行模式
  3. 按下 esc 切换回命令行模式。
  4. 命令模式下,使用 :wq 命令保存并退出。

什么是 vim?

  • vim 是 vi 的升级版
  • vim 更适合 coding

编辑命令:

  • i:插入
  • :wq:保存
  • :q!:强行退出不保存
  • dd:删除光标所在行
  • yy:复制光标所在行到缓冲区
  • p:粘贴缓冲区中的内容
  • gg:光标移动到文件第一行
  • GG:光标移动到文件最后一行
  • ^:光标移动到行首
  • $:光标移动到行尾
  • /:查找关键字,n 键下一个
  • o:在下一行插入
  • x:删除单个字符

四、文件管理

文件管理就是对文件或目录的新建、删除、复制、移动。

新建命令

新建文件:touch 文件名,多个文件用空格分隔。

新建目录:mkdir 目录名,多级目录加 -p 参数

补充:man 命令和 –help 参数

man 和 help 都可以查看某个命令的帮助信息,使用如下:

1
2
man <command>
<command> --help

区别:

  • man 的信息更全面,–help 的信息更简洁。
  • 使用 man 会进入 man page(空格下一页,q 退出),使用 –help 信息直接打印到控制台。

删除命令

删除文件:

  • rm 文件名,多个用空格分隔。这种方式会询问,y 确认删除,n 取消删除。
  • rm -f 文件名,强行删除,不询问。

删除目录:

  • rm -r 目录名,删除目录时,必须加 -r 参数,表示删除一个目录,或递归删除目录下的所有子目录以及子文件。
  • rm -rf 目录名,强行删除,不询问。

复制命令

复制文件:cp 复制的文件 粘贴的路径

复制目录:cp -rf 复制的目录 粘贴的路径

移动命令

移动文件:mv 移动的文件 移动的位置

我们还可以使用这个命令重命名文件,即:mv 源文件 重命名文件

查看文件内容

常用命令:

  • cat 和 tac
  • more 和 less
  • head 和 tail
  • nl
  • tailf

文件的 inode

Linux 中,使用 inode 号(index node)来区分文件,也就是文件的唯一标识。

查看文件的 inode 号:ls -i

文件压缩

使用 tar 参数 要压缩的或解压缩的文件或目录 命令,完成压缩和解压缩,在 Linux 中,压缩后的文件叫做归档文件。

常用参数:

  • c:创建压缩
  • x:解压
  • t:查看压缩文件
  • z:指定 gzip 压缩方式(速度最快,扩展名通常为 tar.gz)
  • j:指定 bzip2 压缩方式(体积最小,扩展名通常为 tar.bz2)
  • v:压缩过程中显示文件
  • f:指定归档文件名,后边不能有其他参数,一般放在最后
  • C:解压到指定目录下

示例:

1
2
3
4
5
6
7
8
9
# 压缩 test 目录,归档文件名为 my.tar.gz
tar -zcvf my.tar.gz test

# 查看压缩文件 my.tar.gz
tar -tf my.tar.gz

# 解压 my.tar.gz
tar -zxvf my.tar.gz # 当前目录
tar -zxvf my.tar.gz -C <directory> # 指定目录

文件权限

概述

为了保证文件安全,Linux 系统引入了文件权限机制。

文件权限包括:rwx

  • 读(Read,简称 r)
  • 写(Write,简称 w)
  • 执行(eXecute,简称 x)

对一个文件来说,有“不同的用户”,包括:UGO

  • 文件拥有者(User,简称 U):文件的创建者
  • 同组用户(Group,简称 G):和文件创建者同组的用户
  • 其他组用户(Other,简称 O):和文件创建者不同组的用户

查看文件权限

之前的 ls -l 命令中就能查看到用户的权限。

例如 rwxr-xr-x:三个字符为一组 rwx r-x r-x,从前往后依次是 UGO 的权限,- 减号表示无权限,U 可以 rwx,G 可以 rx,O 可以 rx。

设置文件权限

有两种方式:基于 UGO 设置和 基于 421 设置

  • UGO
    示例:

    1
    2
    3
    4
    5
    # 给同组用户添加写权限
    chmod g+w <文件或目录>

    # 撤销同组和其他组用户的读权限
    chmod g-r, o-r <文件或目录>
  • 421,分别代表 rwx

    • 4:读权限
    • 2:写权限
    • 1:执行权限
    • 7 表示有所有权限(4+2+1),6 表示读写权限(4+2),5 表示(4+1)读执行权限,3 表示写执行权限(2+1),0 表示没有任何权限
    • 综上所述,共有 0-7 八个数字表示文件权限

    示例:

    1
    2
    # 755 等价于 rwxr-xr-x
    chmod 755 <文件或目录>

CentOS 文件搜索

CentOS 中,文件搜索有以下方式:

  1. find 命令:在指定目录搜索文件。例如:

    1
    find /usr/local -name "catalina.out"
  2. grep 命令:在指定文件中搜索字符串。例如:

    1
    grep "emp" /usr/local/tomcat10/logs/catalina.out
  3. whereis 命令:查找二进制程序、代码等相关文件路径。例如:

    1
    2
    [root@localhost01 ~]# whereis pwd
    pwd: /usr/bin/pwd /usr/include/pwd.h /usr/share/man/man1/pwd.1.gz /usr/share/man/man1p/pwd.1p.gz
  4. which 命令:查找并显示给定命令的绝对路径。例如:

    1
    2
    [root@localhost01 ~]# which pwd
    /usr/bin/pwd

五、软链接和硬链接

软链接

软链接主要用来快捷地访问文件(也就是 Windows 中的快捷方式)。

  • 软链接和目标文件是两个文件(inode 号不一样),软链接文件中存储的是目标文件的路径。

  • 如果目标文件被删除,软链接就失效了(与 Windows 类似)。

创建软链接:ln -s 目标文件 软链接文件

  • 执行 ls 命令查看时,软链接文件为青色,使用 ls -l 可以查看链接的目标文件。
  • 我们还可以执行 ls -i 查看 inode,会发现目标文件和软链接文件的 inode 号不一样。

硬链接

硬链接主要用来重要文件备份。

  • 硬链接文件和目标文件的 inode 号一样。

  • 目标文件被删除,硬链接还在。

创建硬链接:ln 目标文件 硬链接文件(去掉创建软链接中 -s 参数)

  • ls 命令查看,硬链接文件不变色。

六、系统命令

data:查看系统时间

su:切换用户

ps:查看系统进程

  • ps 常用参数
    • -e 查看所有进程
    • -f 显示 UID、PPID、C、STIME 栏位信息

kill:终止进程

  • 强行终止 kill -9 进程号

reboot:重启

shutdown -h now:关机

七、网络通信命令

ifconfig :查看 ip 地址(Windows 中的 ipconfig)

ping:查看计算机之间是否可以正常通信

curl:模拟用户访问,模拟浏览器行为,例如 curl https://shameyang.vip (可以直接查看我的博客首页的前端代码)

wget:下载资源,wget 资源地址

八、管道和重定向

管道

管道本质上就是一个文件,前面的进程以写方式打开文件,后面的进程以读方式打开。这样前面写完后面读,于是就实现了通信。

使用管道符 |,可以将前边的命令的输出作为后边命令的输入

例如:

1
ps -ef | grep user

重定向

>:输出(将原文件内容清空后,再写入)

>>:追加的方式输出(原文件内容的末尾追加)

例如:

1
2
ifconfig > a.txt
ifconfig >> b.txt

九、用户管理

Linux 系统中 root 为超级用户(超级管理员),通过 root 可以创建其他普通用户。普通用户只拥有部分权限,防止一些危险操作导致系统崩溃等安全问题。

Linux 中规定,每一个用户都对应:一个用户名 + 一个口令(账号密码)。普通用户使用系统时输入用户名和口令登录,登陆成功就可以进入自己的主目录。

Linux 用户管理主要包括:

  • 用户组的管理
  • 用户的管理
  • 给用户主目录之外的目录授权

用户组管理

每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。

用户组的管理就是对 /etc/group 文件的更新。

  • 使用 root 用户查看当前系统下的用户组:

    1
    cat /etc/group
  • 查看当前登录的用户属于哪一组:

    1
    groups
  • 查看某个用户属于哪一组:

    1
    groups <user>
  • 用户组的添加、修改、删除:

    1
    2
    3
    4
    5
    6
    7
    8
    # 添加
    groupadd [选项] 组

    # 修改
    groupmod [选项] 组

    # 删除
    groupdel [选项] 组

用户管理

添加用户:

  • 默认组名 = 用户名

  • 默认主目录 = /home/用户名

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 添加用户语法
    useradd [选项] <user>

    # 设置密码
    passwd <password>

    # 设置用户主目录
    useradd -d <主目录> user

    # 设置主目录并指定组和附加组
    useradd -d <主目录> -g <组> -G<附加组> user

切换用户:

1
su <user>

修改用户:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 修改用户语法
usermod [选项] <user>

# 修改用户名
usermod -l <username> user

# 修改主目录
usermod -d <主目录> -m user

# 修改所属组
usermod -g <组> user

# 锁定用户
usermod -L user

# 解锁用户
usermod -U user

删除用户:

1
2
3
4
5
# 删除用户语法
userdel [选项] <user>

# 删除用户以及其主目录
userdel -r user

给用户主目录之外的目录授权

给目录授权:

1
2
# 递归设置权限
chmod -R 775 <directory>

把目录赋予用户所在组:

1
chgrp -R <组> <directory>

给用户添加附加组:

1
usermod -G <组> <user>

十、软件的安装和卸载

软件安装方式

在 CentOS 中,安装软件的方式主要包括:

  • 源码安装
  • rpm 安装(二进制)
  • yum 安装(在线)
  • dnf(yum 升级版)

源码安装

源码包:源代码文件的一个压缩包,通常为 .tar.gz 或 .tar.bz2。

源码安装通常需要编译器,将源码编译成二进制文件,例如 gcc 编译器

优点:

  • 开源,可以修改源代码;利于解读源码
  • 可以自由选择功能
  • 方便卸载

缺点:

  • 安装麻烦,需要解决相关依赖
  • 大型软件的编译对新手不友好

rpm 安装

RPM 包(后缀为 .rpm):Red Hat 开发的包管理系统,方便软件的安装、升级、卸载。CentOS、Redhat、Fedora 等 Linux 发行版都在用这种包管理机制。

DPKG 包(后缀为 .deb):Debian Linux 开发的包管理机制,主要应用在 Debian 和 Unbuntu 系统中。

优点:

  • 包的安装和管理简单
  • 安装速度比源码快很多

缺点:

  • 二进制文件,看不到源码
  • 模块功能定制,用户功能选择不灵活
  • 有时需要解决依赖问题

yum 安装

yum 是一个在 Fedora 和 RedHat 以及 CentOS 中的 Shell 前端软件包管理器。基于 RPM 包管理,能够从指定的服务器自动下载并安装 RPM 包,可以自动处理依赖性关系,并且一次安装所有依赖的软件包。

dnf

  • DNF包管理器克服了YUM包管理器的一些瓶颈,提升了包括用户体验,内存占用,依赖分析,运行速度等多方面的内容。
  • dnf 与 yum 的区别:
    • 语法:dnf 语法更简洁
    • 性能:dnf 使用了更高效的算法,处理软件包的性能更好
    • 依赖关系处理:dnf 处理软件包依赖关系时更加智能
    • 使用的库不同:dnf 使用更加现代化的 libdnf 库,yum 使用比较老的 yum 库
    • 插件:dnf 支持更多的插件

yum 安装卸载的相关命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 安装、升级
yum -y install <software>

# 升级所有软件
yum -y install

# 卸载
yum remove <software>

# 列出可安装的软件包
yum list

# 列出已安装的软件包
yum list installed

# 查询某个软件包
yum list <software>

# 根据关键字搜索软件包
yum search <keyword>

# 清楚缓存
yum clean all

# 更新系统
yun -y update

JDK 的安装和配置(JDK17)

这里以 jdk 17 为例,根据自己系统选择合适的版本

安装 JDK

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1.更新系统
sudo yum -y update

# 2.安装 wget 命令行工具
sudo yum -y install wget vim

# 3.下载 jdk 17
wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm

# 4.CentOS 7 上安装
sudo yum -y install ./jdk-17_linux-x64_bin.rpm

# 5.如果 jdk 有其他版本,切换一下
alternatives --config java

注意:如果运行不了 javac 命令,尝试安装 java-11-openjdk-devel.x86_64(这里以 JDK11 为例)

配置环境变量修改之前先备份!!!

Linux 中路径用冒号 :,获取 JAVA_HOME 使用美元符号 $

  • /etc/profile:环境变量配置

    1
    2
    3
    4
    JAVA_HOME=java根路径
    CLASSPATH=.:$JAVA_HOME/lib
    PATH=$PATH:$JAVA_HOME/bin
    export JAVA_HOME CLASSPATH PATH
  • 命令行:使环境变量生效

    1
    source /etc/profile

切换 JDK 版本

1
alternatives --config java

查看系统是否安装 JDK

1
rpm -qa | grep jdk

Tomcat 的安装和配置(Tomcat10)

这里以 Tomcat10 为例,需要 JDK 版本:JDK 17

安装

  • 第一步:Apache 官网下载 Tomcat 的压缩包 tar.gz 格式的即可

  • 第二步:使用 Xftp 将压缩包上传到 Linux 服务器上,这里选择上传到 /root 目录下

  • 第三步:命令行解压

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 检查上传是否成功
    ls

    # 解压
    tar -zxvf apache-tomcat-10.1.19.tar.gz

    # 移动到 /usr/local 下
    mv ./apache-tomcat-10.1.19 /usr/local

    # 打开 /usr/local
    cd /usr/local

    # 重命名
    mv apache-tomcat-10.1.19 tomcat10

配置环境变量

  • /etc/profile:

    1
    2
    3
    # Tomcat
    export CATALINA_HOME=/usr/local/tomcat10
    export PATH=$PATH:$CATALINA_HOME/bin
  • 使环境变量生效

    1
    source /etc/profile

测试

1
2
3
4
5
6
7
8
# 回到工作目录
cd ~

# 启动 tomcat
startup.sh

# 访问
ip:8080

这时访问 8080 端口会因为防火墙打不开,需要我们关闭防火墙或打开 8080 端口并重启防火墙

关闭防火墙

1
systemctl stop firewalld.service

打开端口并重启防火墙

1
2
3
4
5
6
7
8
# 开启端口 
# --zone:作用域
# --add-port=80/tcp:添加端口,格式为:端口/通讯协议
# --permanent:永久生效,没有此参数重启后失效
firewall-cmd --zone=public --add-port=8080/tcp --permanent

# 重启防火墙
systemctl restart firewalld.service

防火墙的其他命令

systemctl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 开启防火墙服务
systemctl start firewalld.service
# 重启服务
systemctl restart firewalld.service
# 关闭服务
systemctl stop firewalld.service
# 查看防火墙服务状态(详细)
systemctl status firewalld.service

# 查看服务是否开机启动
systemctl is-enabled firewalld.service
# 开机启动
systemctl enable firewalld.serive
# 开机禁用
systemctl disable firewalld.service

firewall-cmd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 重启防火墙
firewall-cmd --reload

# 查看防火墙状态(简略)
firewall-cmd --state

# 查看防火墙已经开放的端口
firewall-cmd --list-all

# 查看端口信息
firewall-cmd --list-ports

# 查看某端口是否开放
firewall-cmd --query-port=8080/tcp

# 开启端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent

# 关闭端口
firewall-cmd --zone=public --remove-port=8080/tcp --permanent

MySQL 的安装和配置(MySQL 8)

参考文章:CentOS 7 安装 MySQL 8

第一步:卸载 MariaDB(CentOS 7 自带的,会与 MySQL 冲突)

1
2
3
4
5
6
7
8
# 查看是否安装 MariaDB
rpm -qa | grep mariadb

# 卸载
rpm -e --nodeps 查找到的MariaDB

# 检查是否卸载干净
rpm -qa | grep mariadb

第二步:检查依赖

1
2
3
4
5
6
7
8
# 查看是否安装 libaio
rpm -qa | grep libaio

# 查看是否安装 numactl
rpm -qa | grep numactl

# 没有则安装
yum -y install 要安装的依赖

第三步:安装 MySQL

官网下载 对应版本压缩包,使用 Xftp 上传到 /usr/local 目录下

1
2
3
4
5
6
7
8
9
10
cd /usr/local

# 1.拆分 tar 包
tar -xvf mysql-8.0.33-el7-x86_64.tar

# 2.解压
tar -zxvf mysql-8.0.33-el7-x86_64.tar.gz

# 3.重命名
mv mysql-8.0.33-el7-x86_64.tar mysql

第四步:配置 MySQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 1.创建数据存储目录
mkdir mysql/data

# 2.设置用户组并赋权
groupadd mysql

useradd -r -g mysql mysql

chown -R mysql:mysql /usr/local/mysql/

chomd -R 755 /usr/local/mysql/

# 3.初始化 MySQL
cd /usr/local/mysql/bin
./mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql
##初始化后会打印到控制台一个随机密码,下边会用到

# 4.配置参数文件
vi /etv/my.cnf
chmod 777 /etc/my.cnf
  • 参数文件 my.cnf:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    [client]
    port = 3306
    socket = /usr/local/mysql/data/mysql.sock
    default-character-set = utf8mb4

    [mysql]
    default-character-set = utf8mb4

    [mysqld]
    character-set-client-handshake = FALSE
    character-set-server = utf8mb4
    collation-server = utf8mb4_general_ci
    init_connect = 'SET NAMES utf8mb4'

    port = 3306
    socket = /usr/local/mysql/data/mysql.sock
    skip-external-locking
    key_buffer_size = 16M
    max_allowed_packet = 1M
    table_open_cache = 64
    sort_buffer_size = 512K
    net_buffer_length = 8K
    read_buffer_size = 256K
    read_rnd_buffer_size = 512K
    myisam_sort_buffer_size = 8M
    datadir = /usr/local/mysql/data
    #lower_case_table_names=1
    #如果要设置lower_case_table_names可以在初始化里面设置 ./mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql --lower_case_table_names=1

    [mysqldump]
    quick
    max_allowed_packet = 16M

    [mysql]
    no-auto-rehash

    [myisamchk]
    key_buffer_size = 20M
    sort_buffer_size = 20M
    read_buffer = 2M
    write_buffer = 2M

    [mysqlhotcopy]
    interactive-timeout

第五步:启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 1.启动
/usr/local/mysql/support-files/mysql.server start

# 2.设置软连接,并重启MySQL
ln -s /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
ln -s /usr/local/mysql/mysql.sock /var/mysql.sock
service mysql restart

# 3.登录并修改密码,密码为初始化时生成的那个
mysql -uroot -p

alter user 'root'@'localhost' identified by 'xxx';

# 4.开放远程连接
mysql>use mysql;
msyql>update user set user.Host='%' where user.User='root';
mysql>flush privileges; //刷新权限

# 5.开放 3306 端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent

# 6.重启防火墙
firewall-cmd --reload

最后一步:测试连接

MySQL 服务启停

这里演示的是 CentOS 7 中的命令

1
2
3
4
5
6
7
8
9
10
11
# 启动
systemctl start mysql

# 停止
systemctl stop mysql

# 重启
systemctl restart mysql

# 查看状态
systemctl status mysql

十一、JavaWeb 项目部署到生产环境(Linux)

部署

步骤如下:

  1. 修改 jdbc 配置的 url

    1
    2
    3
    4
    5
    # 之前的
    url=jdbc:mysql://localhost:3306/project

    # 修改后
    url=jdbc:mysql://Linux服务器ip:3306/project
  2. Maven 执行 package 命令,对项目进行打包(打包方式为 war)

  3. 将 war 包上传到 Tomcat 根目录的 webapps 目录下

  4. Linux 服务器启动 Tomcat,上传的 war 包会被自动解压

  5. 启动成功后,直接访问即可

实时监视

Linux 命令行:进入 Tomcat 根目录下的 logs 目录

1
2
3
4
5
# 打开日志文件
cd /usr/local/tomcat10/logs

# 实时监视
tail -f calalina.out

十二、netstat 查看服务及监听端口

实际开发中,netstat 最常用的操作是查看网络连接情况,包括正在监听的接口、建立的连接、连接状态等信息。

常用参数和用法:

  1. 查看所有的网络连接状态

    1
    netstat -a

    LISTEN:端口已占用,正在监听,连接未建立,等待连接。

    ESTABLISHED:两台机器正在通信中。

    TIME_WAIT:连接已终止。

  2. 查看所有处于监听状态的连接

    1
    netstat -l
  3. 查看所有 TCP、UDP 连接状态

    1
    2
    netstat -t # TCP
    netstat -u # UDP
  4. 查看所有 TIME_WAIT 状态的连接

    1
    netstat -o
  5. 查看指定端口的网络连接状态

    1
    netstat -an | grep 端口号

十三、Shell 编程

概述

Shell 是一种与操作系统进行交互的命令行解释器。它是一种脚本语言,可以通过编写一些列的命令和脚本来执行操作系统的功能和任务。

Shell 脚本文件后缀为 .sh(Windows 中为 .bat)。

我们在终端编写的命令都是 Shell 命令,例如:ls、grep 等。

Linux 系统中,常见的 Shell 包括:

  • Bourne Shell(/bin/sh)
  • Bourne-Again Shell(/bin/bash)
  • C Shell(/bin/csh)
  • TENEX C Shell(/bin/tcsh)
  • Korn Shell(/bin/ksh)
  • Z Shell(/bin/zsh)

CentOS 中默认 Shell 为 bash,可以使用 chsh 命令更改默认 Shell:

  1. 查看已安装的 Shell

    1
    cat /etc/shells
  2. 更改 Shell

    1
    chsh -s 要更改的Shell路径
  3. 检查当前 Shell

    1
    echo $SHELL

Shell 基础语法

注释

单行注释 #

1
# 这是一行注释

多行注释 :''

1
2
3
:'
这里是多行注释的内容
'

变量

我们在 Linux 中使用命令行环境时,Shell 变量非常重要。Shell 变量可以用来存储和操作数据,让我们更加方便地管理文件、程序和系统。

Linux 中,有三种 Shell 变量:

  • 环境变量
  • 本地变量
  • 特殊变量

环境变量

环境变量是系统级别的变量(可以理解为全局变量),在 Shell 会话外配置。之前 /etc/profile 中配置的 JAVA_HOME=xxx、CATALINA_HOME=xxx、PATH=xxx 都是环境变量。

查看当前所有环境变量:

1
printenv

1
env

设置一个新的环境变量:

1
export MY_VAR="Hello"

使用环境变量:

1
echo $MY_VAR

本地变量

本地变量是一种临时变量(可以理解为局部变量),在 Shell 会话中配置和使用。本地变量仅限于当前 Shell 会话。

设置本地变量:

1
MY_VAR="Hello"

使用本地变量:

1
echo $MY_VAR

特殊变量

特殊变量是在 Shell 中预定义的变量名称,具有特殊含义。这些变量与当前 Shell 会话有关,有许多用途,例如文件和目录操作、命令历史记录等。

常见的特殊变量:

  • $0:当前脚本的文件名
  • $1, $2...:脚本参数列表中的第几个参数
  • $#:脚本参数的数量
  • $*:所有脚本参数的列表
  • $@:所有脚本参数的列表(字符串)
  • $$:当前 Shell 的进程 ID
  • $?:上一个命令的退出状态,一个数值

例如:

1
2
3
4
5
6
#!/bin/bash
echo "name: $0"
echo "fisrt param: $1"
echo "param num: $#"
echo "progress id: $$"
echo "last exit stat: $?"

控制语句

if 语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
if condition
then
command1
command2
...
elif condition2
then
command3
command4
...
else
command5
command6
...
fi

# 示例
if [ $1 -eq $2 ]
then
echo "$1等于$2"
elif [ $1 -lt $2 ]
then
echo "$1小于$2"
else
echo "$1大于$2"
fi

for 循环

1
2
3
4
5
6
7
8
9
10
11
12
for var in list
do
command1
command2
...
done

# 示例
for i in 1 2 3 4 5
do
echo $i
done

while 循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
while condition
do
command1
command2
...
done

# 示例
i=10
while [ $i -gt 0 ]
do
echo $i
i=$((i-1))
done

until 循环

until 循环条件不成立则一直循环,与 while 相反

1
2
3
4
5
6
until condition
do
command1
command2
...
done

break 和 continue

控制循环的关键字,与 JAVA 中同理。

Shell 中的中括号 []

Shell 中的中括号有两种使用方式:

注意:① 中括号里最左边和最右边要有一个空格,② 变量用双引号括起来,否则语法错误

  1. 比较操作符,例如:[ $a -eq $b ]
    • -eq:等于
    • -ne:不等于
    • -lt:小于
    • -gt:大于
    • -le:小于等于
    • -ge:大于等于
  2. 测试表达式,例如:[ -f test.txt ]
    • -f:文件是否存在并且是一个常规文件
    • -d:文件是否存在并且是一个目录
    • -z:字符串是否为空
    • -n:字符串是否非空
    • -e:文件或目录是否存在

函数

定义:

1
2
3
4
5
6
7
8
9
10
11
function name() {
commands
}

# 示例
#!/bin/bash
function hello() {
echo "Hello $1!"
}

hello "World" # 调用

输出重定向

Shell 编程中,重定向是一种将输出从一个点重定向到另一个点的方法。

内存 —> 文件

标准输出重定向

在命令中使用 > 以覆盖方式输出重定向到指定文件,例如:

1
ls > file.txt

使用 >> 以追加方式,输出重定向到指定文件,例如:

1
ls >> file.txt

错误输出重定向

  • 2>:将错误信息以覆盖方式输出重定向
  • 2>>:将错误信息以追加方式输出重定向

输出复制与分割

使用 | 管道符(之前有提过),将一个命令的输出作为另一个命令的输入。

例如:

1
ls | grep file

输入重定向

内存 <— 文件

例如:将 test.txt 文件输入给 sort 命令

1
sort < test.txt

数据库自动备份

下面是一个用 Shell 编写的自动备份数据库的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash

# 设置备份目录
backupDir="/home/backup"

# 设置需要备份的数据库名称、用户名、密码
dbUser="root"
dbPass="xxx"
dbName="database_name"

# 设置备份文件夹(当前日期时间命名)
backupFile="$backupDir/${dbName}_$({date +%Y%m%d_%H%M%S}).sql"

# 执行备份命令
mysqldump -u$dbUser -p$dbPass $dbName > $backupFile

# 压缩备份文件
gzip -f $backupFile

# 删除7天前的备份文件
find $backupDir -mtime +7 -type f -name "${dbName}*.sql.gz" -delete

将脚本保存到一个文件中,例如 backup_db.sh,添加可执行权限:

1
chmod +x backup_db.sh

编辑 crontab 文件,可以将脚本设置为定期自动运行,例如每天执行一次:

1
2
3
4
5
6
# 编辑 crontab 文件
crontab -e

# 每天 12:20 执行一次,下边的 # 不是注释
0 0 * * * /path/to/backup_db.sh
# 20 12 * * * /path/to/backup_db.sh