对于Java程序员来说,关于Linux重点学习 基础命令 和 **项目部署(Java)**即可
一、Linux环境搭建
1.1环境搭建方式
主要有四种:
- 直接安装在物理机上。但是Linux桌面使用起来非常不友好--不推荐
- 使用虚拟机软件,将Linux搭建在虚拟机上。但是由于当前的虚拟机软件(如VMWare之类的)存在一些bug,会导致环境上出现各种莫名其妙的问题--非常不推荐
- 使用WSL(Windows Subsystem for Linux)。这个是Windows近几年开发的新功能,在Windows系统内集成了一个Linux。但是目前这个技术还不够成--暂时不推荐
- 使用云服务器,可以直接在 腾讯云,阿里云或华为云 等服务器厂商处直接购买一个云服务器--推荐
使用云服务器不仅环境搭建简单,避免折腾,同时还有一个最大的好处,部署在云服务器上的项目可以直接被外网访问到,这个时候就和一个公司发布一个正式的网站没有任何区别,
1.2使用云服务器
在使用云服务器环节,我们最重要的是得到三个信息:
- 服务器的外网IP
- 服务器的管理员账户
- 管理员账户密码(自己设置的)
1.3使用终端软件连接到Linux
终端软件是一类工具软件,可以和远程的主机建立网络连接,从而对主机进行一些操作
常见的终端软件:
·XShell(这里我们使用的--下载免费版即可)
·Putty
·MobaXTerm
·Iterm2
·SecureCRT
终端软件(如XShell)和远程服务器的工作流程

二、Linux常用命令
这里我们选在使用 蓝桥云课 中的Linux学习进行代码的演示
初始文件:

ls
语法:ls [选项] [目录或文件]
常用选项:
· -a:列出目录下的所有文件,包括以 . 开头的隐含文件
· -d:将目录像文件一样显示,而不是显示其下的文件。如:ls -d 指定目录
· -k:以k字节的形式表示文件的大小。如 ls -alk 指定文件
· -l:列出文件的详细信息
· -r:对目录反向排序
· -t:以时间排序
· -R:列出所有子目录下的文件(递归)

pwd
语法:pwd
功能:显示用户当前所在的目录

cd
Linux系统中,磁盘上的文件和目录被组成一棵目录树,每个节点都是目录或文件
语法:cd 目录名
功能:改变工作目录。将当前工作目录改变到指定的目录下

touch
语法:touch [选项]... 文件 ...
功能:touch命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新建一个不存在的文件
如:touch test.txt


cat
语法:cat [选项] [文件 ]
功能:查看目标文件的内容
常用选项:
· -n:对输出的所有行编号
如:cat test.txt
当前test.txt未输入任何数据,所以使用cat是无法查询到内容的

mkdir
语法:mkdir [选项] dirname ...
功能:在当前目录下创建一个名为"dirname"的目录
常用选项:
· -p,-parents:可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多级目录
如:
mkdir test


rm
语法:rm [-f-i-r-v] [dirName/dir]
功能:删除文件或目录
常用选项:
· -f:即使文件属性为只读(即写保护),亦直接删除
· -i:删除前逐一询问确认
· -r:删除目录及其下所有文件
如:
rm -r test(这是一个目录)
注意事项:
千万不要运行 rm -rf

注意:当直接使用rm对目录进行删除时,是无法进行的。这里需要添加选项 -r


vim
vim是一个知名的文本编辑器,使用vim就可以进行文本编辑了
vim就相当于Windows的记事本,只不过功能比记事本强大一些
1)创建文件/打开文件
vim [文件名]
2)进入插入模式
vim 打开文件后默认是普通模式。普通模式下键盘的按键表示一些特殊功能的快捷键(例如 按下 j 并不是输入字母"j",而是表示光标往下移动一行)。需要进入插入模式才能进行文本编辑
使用 i 键可以进入到 插入模式(左下角提示--INSERT--)然后就可以像记事本一样正常编辑了
3)保存
在插入模式下不能保存文件,需要先回到 普通模式。 按下 Esc 回到普通模式
在普通模式下输入 :w ,再按下回车,即可保存文件
4)退出
在插入模式下不能退出,需要先回到 普通模式
退出时,分以下情况:
1、文件未修改:输入 :q,再按下回车,即可退出
2、文件修改并保存:使用 :wq 同时执行保存和退出
3、文件修改,但不希望保存: 使用 :wq! 进行强制退出
在test.txt文件中输入hello world
命令:
1.打开文件(默认是普通模式)
vim test.txt
2.进入插入模式
使用 i 键进入插入模式
3.输入数据
如这里的:hello world
4.保存并退出
先回到普通模式--使用Esc键
在普通模式--输入 :wq进行保存
4



查看test.txt文件

cp
语法:cp [选项] 源文件或目录 目标文件或目录
功能:复制文件或目录
说明:cp指令用于复制文件或目录。
若同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。
若同时指定多个文件或目录,而最后的目的地并非一个已存在的目录,则会出现错误信息
常用选项:
· -f或-force:强行复制文件或目录,不论目的文件或目录是否已经存在
· -i或-interactive:覆盖文件之前先询问用户
· -r:递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录的形态,不属于目录或符号链接,则一律视为普通文件处理
· -R或-recursive:递归处理,将指定目录下的文件及子目录一并处理
如:
cp test.txt test2.txt


mv
语法:mv [选项] 源文件或目录 目标文件或目录
功能:
1.视mv命令中第二个参数类型的不同(是目标文件还是目标目录),mv命令将文件重命名或将其移至一个新的目录中
2.当第二个参数类型是文件时,mv命令完成文件重命名,此时 源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为 给定的目标文件名
3.当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中
常用选项:
· -f:如果目标文件已经存在,不会询问而直接覆盖
· -i:若目标文件已经存在时,就会询问是否覆盖
如:将test.txt文件重命名为1.txt
命令:mv test.txt test1.txt

tail
语法:tail [必要参数] [选择参数] [文件]
功能:用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件
选项:
· -f:循环读取
· -n<行数>:显示行数
如:查看test1.txt文件的末尾内容
命令:tail test1.txt

grep
语法:grep [参数]... [文件]...
功能:用于查找文件中是否包含指定字符串,并显示对应的行
选项:
· -n<行数>:显示行数
· -w:全字匹配。要求整个单词都完全相同的结果才能匹配出来,而不仅仅是一个单词的一个部分
· -r:递归查找。可以搜索多级目录下的所有文件
· --color:高亮查找到的结果
· --include:指定查找某些文件
· --exclude:指定排除某些文件
如:查询test1.txt是否包含"hello"字符串,并显示对应的行
命令:grep "hello" test1.txt

ps
语法:ps [参数]...
功能:用于查看当前系统上运行的进程
选项:
· a:显示一个终端的所有进程
· u:以用户为主的格式来显示程序状况
· x:显示所有程序,不止是会话中的进程
· e:显示所有进程,包括系统守护进程
· f:显示完整格式输出
如:
ps aux #显示系统上所有的进程
ps aux | grep "进程名"
ps aux | grep "进程id"

netstat
语法:netstat [参数] ...
功能:查看系统上的网络状态
选项:
· -a:显示所有正在或不在侦听的套接字
· -n:显示数字形式地址而不是去解析主机、端口或用户名
· -p:显示套接字所属进程的PID和名称
如:
netstat -anp
netstat -anp | grep "进程名"
netstat -anp | grep "端口号"

管道
管道是一种古老的"进程间通信"方式。在Linux指令中可以使用 | 作为管道标记
意思是 将前一个指令标准输出的内容,作为第二个指令的标准输入内容
ps -ef | grep "java"
ps -ef | head -10
tail -f log.txt | grep "Exception"
管道的工作原理
管道在内核中维护一个内存缓冲区(通常为4KB或更大)
左侧命令写入数据到管道(通过其标准输出)
右侧命令从管道读取数据(通过其标准输入)
如果管道满了,写入会阻塞;如果管道空了,读取会阻塞
管道是单向的:数据只能从左向右流动
如:读取test1.txt的文件内容,并将数据写入到管道,从管道中读取数据,查看是否包含"w"字符串

三、搭建Java部署环境
步骤:
在XShell等终端软件上进行操作
1.下载Linux软件包管理工具--apt
2.JDK--Java项目所需要的
3.MySQL--数据库配置
4.配置Web项目到Linux--部署到远程服务器上
apt(Advanced Packaging Tool)
apt是Linux软件包管理工具。用于在Ubuntu、Debian和相关Linux发行版上安装、更新、删除和管理deb软件包。简单来说,它相当于系统的"官方应用商店",让我们能用一条命令完成软件的搜索、安装、升级和卸载,并且能自动处理复杂的依赖关系
大多数apt命令必须以具有sudo权限的用户身份运行
apt的核心价值:自动化依赖管理
apt最核心的价值在于 自动化的依赖管理。在apt出现之前,手动安装软件往往是个"依赖地狱":我们需要逐个下载并安装A、B、C等多个依赖包,且版本必须兼容。apt解决了这个问题,我们只需告诉它要安装什么,它就会自动计算并下载所有必需的依赖,让整个过程变得简单可靠
常用命令
列出所有软件包--apt list
这个命令输出所有包的列表,内容比较多,可以使用grep命令过滤输出
如:apt list | grep "java"
更新软件包数据库--sudo apt-get update
apt实际上在可用软件包的数据库上工作。如果数据库没有更新,系统将不知道是否有更新的软件包可用。这就是为什么在安装任何Linux系统之后,第一件事应该是更新apt数据库
运行此命令时,您将看到从各种服务器检索到的软件包信息
安装软件包--sudo apt install package_name
移除软件包--sudo apt remove package_name
remove命令将卸载给定的软件包,但可能会留下一些配置文件。如果要删除包含所有配置文件的软件包,请使用purge而不是remove
apt remove和 apt purge的区别
·apt remove删除包的二进制文件,它留下了残留的配置文件
·apt purge删除与包相关的所有内容,包括配置我呢见
如果弄乱了程序的配置,希望从系统中完全清除它的痕迹再重新开始,可以使用apt purge
JDK
1、更新软件包
sudo apt-get update
2、安装openjdk
查找jdk包--apt list | grep "jdk"
安装jdl--sudo apt install openjdk-17-jdk
注意:此处安装的是OpenJDK,OpenJDK是一个开源版本的JDK,和Oracle官方的JDK略有差别。此处我们就使用OpenJDK即可。安装Oracle JDK比较麻烦
使用 java -version 验证是否安装成功
如果提示 "java命令找不到"则说明安装失败
卸载OpenJDK
检查安装的是哪个OpenJDK
dpkg --list |grep -i jdk
移除openjdk包
apt-get purge openjdk*
卸载OpenJDK相关包
apt-get purge icedtea-* openjdk-*
检查所有OpenJDK包是否都已卸载完毕:
dpkg --list | grep -i jdk
MySQL
1.使用apt安装MySQL
查找安装包
apt list |grep "mysql-server"
安装mysql
sudo apt install mysql-server
2.查看MySQL状态
sudo systemctl status mysql
3.MySQL安装安全设置
默认的MySQL设置是不安全的,MySQL安装提供了一个安全脚本,用于解决不太安全的默认选项
运行以下命令:
sudo mysql_secure_installation
接下来按照提示输入即可
4.设置密码
连接mysql服务器
sudo mysql
使用alter user 命令修改密码
alter user '账户'@'localhost' identified with mysql_native_password by '密码'
这里设置的密码后续在生产环境的配置文件(application-prod.yml)中会用到,用于登录并操作数据库
卸载MySQL
停止MySQL
sudo systemctl stop mysql
卸载mysql
sudo apt-get remove --purge mysql-server mysql-client mysql-common
删除MySQL配置文件和数据
sudo rm -rf /etc/mysql /var/lib/mysql
清理残留文件和目录
sudo apt-get autoremove
sudo apt-get autoclean
验证卸载结果
mysql --version
部署Web项目到Linux
什么是部署
工作中涉及到的"环境"
- 开发环境:开发人员写代码用的机器
- 测试环境:测试人员测试程序使用的机器
- 生产环境(线上环境):最终项目发布时所使用的机器。对稳定性要求很高
把程序安装到生产环境上,这个过程称为"部署"。也叫"上线"
一旦程序部署成功,那么这个程序就能被外网中千千万万的普通用户访问到
换句话说,如果程序有BUG,这个BUG也就会被千千万万的用户看到
为了防止部署出错,一般公司内部都会有一些自动化部署工具(如Jenkins等)。当前我们先使用手动部署的方式来完成
环境配置
程序正常运行,需要保证环境和程序都要正确,我们需要先配置环境
须知:
我们在开发环境中的数据库表也需要发布到生产环境,此时项目中的配置文件(有关数据库)就需要更改路径(改为生产环境)
所以我们需要 数据库表代码准备+数据准备+程序配置文件修改 这三步去完成环境的配置
简单来说,我们本地(开发环境)下的数据库也需要放到线上,不然线上没有数据库数据,是无法进行的(好比说:进行登录时,线上没有数据库数据,那怎么能进行后续操作呢)
这里数据库表代码和数据直接复制本地sql,然后在终端软件XShell进行执行即可,所以就不进行展示了
多环境文件配置
针对不同环境创建不同的配置文件,要求名字为application-XXX.yml或application-XXX.properties
以下以application-XXX.yml为例

在配置文件里写不同的内容
application-dev.yml

application-prod.yml

在主配置文件application.yml中指定配置文件,并删除数据库相关配置

从Maven中读取环境配置变量(pom.xml)

修改application.yml

这里将active修改为 @profile.name@,使得在打包前,勾选哪个环境,就能将对应的配置文件打包
构建项目并打包
在本地使用maven进行打包
1.如果Test代码中有与环境配置相关的操作(比如数据库相关的操作),打包会失败,点击下图①处的图标,即可以跳过测试
2.点击clean-->package

点击package后,控制台会显示jar包的位置,以及是否打包成功
上传Jar包到服务器,并运行
1.上传Jar包
直接拖动打好的jar包到XShell窗口即可完成文件的上传

2.运行程序
nohup java -jar spring-blog-demo-0.0.1-SNAPSHOT.jar.0 &
3.查看是否运行
ps -ef | grep "java"

4.访问项目
这里通过url访问网页,并进行功能的验证,发现正常运行
常见问题
一个程序的正常运行,需要程序的正确和环境的正确。同样的代码在Windows上可以运行成功,不一定在Linux上运行成功。不同的系统对代码的理解和支持是不同的。比如Windows系统对MySQL不区分大小写,而Linux区分大小写
服务不能正常访问的原因有很多,主要分以下几方面
1.服务未启动
a.使用ps -ef | grep "java" 查看java程序是否在运行
b.如果未启动成功,需要查看对应的日志,根据原因来分析:
i.数据库不存在
ii.表不存在(区分大小写)
iii.数据库密码不正确
iv.JDK安装版本不对,或者未安装
v.mysql未设置密码
vi. ......
2.http端口未开放
检查云服务器防火墙/安全组是否开放相应端口(如8080)

杀掉进程
如果我们需要重启服务,或者重新部署等,都需要先停止之前的服务
查看当前服务的进程
ps -ef |grep "java"

上图的242033就是该服务的进程
杀掉进程
kill -9 PID
即:kill -9 242033