Java进阶全套教程(六)—— Linux运维实战超详细详解

一、Linux核心基础认知(Java开发必备)

1.1 Linux系统定位与企业应用场景

Linux是一款开源、免费、多用户、多任务、支持多线程与多CPU的类Unix操作系统,具备高稳定、高安全、低资源占用、可自由裁剪的核心特性,是后端开发、服务器运维、大数据、云计算领域的底层核心系统。

对于Java开发者而言,日常开发、项目部署、服务上线、故障排查、性能优化全流程都离不开Linux系统。企业中99%的JavaWeb项目、微服务集群、中间件(Redis、Tomcat、MySQL、MQ)均部署在Linux服务器(主流CentOS7/8、Ubuntu20.04),熟练掌握Linux命令与运维操作是后端工程师核心必备技能。

相较于Windows系统,Linux核心优势:无图形化冗余开销、后台服务稳定常驻、长期运行不卡顿、权限管控严格、网络性能优异、适配分布式集群架构。

1.2 Linux文件系统核心架构

Linux采用唯一树形根目录架构,所有文件、磁盘、硬件设备全部挂载在根目录/之下,无Windows盘符(C/D/E盘)概念,目录层级唯一且规范,是系统稳定运行的基础。

1.2.1 核心系统目录功能详解

  • /:系统根目录,所有目录的顶级父节点,整个文件系统的入口

  • /root:超级管理员root的家目录,权限最高,仅root用户可完全访问

  • /home:普通用户家目录集合,每个普通用户对应一个同名子目录,用于存放用户私有文件

  • /etc:系统与软件核心配置文件目录,所有服务、系统参数配置均存放于此(Java项目、MySQL、Redis配置文件默认存放核心目录)

  • /usr:系统软件安装默认目录,相当于Windows的Program Files,存放系统自带程序、依赖库、帮助文档

  • /var:动态数据目录,存放日志文件、缓存数据、数据库运行数据、定时任务临时文件

  • /bin:普通用户可执行的基础命令(ls、cd、cp、mv等),系统开机即可调用

  • /sbin:管理员专属系统命令,用于系统运维、权限管理、硬件配置,仅root用户可执行

  • /tmp:系统临时文件目录,存放运行临时缓存,重启后自动清空

  • /dev:硬件设备挂载目录,磁盘、网卡、U盘、光驱等硬件均以文件形式展示

  • /proc:虚拟进程目录,不占用磁盘空间,实时映射系统进程、CPU、内存运行状态

二、Linux磁盘管理核心命令(运维必备)

磁盘管理是服务器运维核心操作,主要用于排查磁盘空间不足、分区异常、挂载失效等问题,Java项目部署前必须确认磁盘容量充足,避免项目日志溢出、服务启动失败。

2.1 df 磁盘空间查询命令

核心作用:查看系统各文件系统磁盘总容量、已用容量、剩余容量、使用率、挂载点,快速定位磁盘爆满问题。

2.1.1 常用参数详解

  • -h:人性化单位显示(KB/MB/GB),默认字节单位,生产最常用参数

  • -a:显示所有文件系统,包含系统虚拟文件系统(/proc、/sys)

  • -T:显示分区文件系统类型(ext4、xfs等)

  • -i:查询inode使用情况,排查inode耗尽导致的磁盘无法写入问题

2.1.2 实战命令案例

# 人性化查看磁盘整体使用情况(生产高频)
df -h

# 查看磁盘容量+文件系统类型
df -hT

# 查看inode使用状态,排查文件创建失败问题
df -hi

# 仅查看指定目录所在磁盘使用情况
df -h /usr/local

2.1.3 输出字段解析

Filesystem:分区设备名称;Size:总容量;Used:已用容量;Avail:可用容量;Use%:使用率;Mounted on:挂载目录。生产环境中,磁盘使用率超过85%需及时清理日志、扩容分区,防止服务宕机。

2.2 lsblk 磁盘设备查看命令

核心作用:查看系统所有磁盘设备、分区大小、挂载状态、设备层级,快速确认新硬盘是否被系统识别。

2.2.1 常用参数与实战案例

# 查看所有磁盘设备简洁信息
lsblk

# 查看磁盘+文件系统完整信息
lsblk -f

# 以列表形式展示磁盘信息,去除冗余样式
lsblk -l

# 查看磁盘拓扑结构
lsblk -t

2.3 fdisk 磁盘分区命令

核心作用:创建、修改、删除磁盘分区,适配新硬盘分区场景,是服务器磁盘扩容核心工具。

2.3.1 核心操作指令

  • m:查看所有帮助指令

  • n:新建分区(主分区/扩展分区)

  • p:查看当前分区列表

  • d:删除指定分区

  • w:保存分区修改并退出

  • q:不保存修改,直接退出

2.3.2 新硬盘分区完整实战流程

# 1. 查看所有磁盘,确认新增硬盘设备(如/dev/sdb)
fdisk -l

# 2. 进入新硬盘分区编辑模式
fdisk /dev/sdb

# 3. 输入n新建分区,输入p选择主分区,默认分区编号1,回车确认分区起止扇区
# 4. 输入w保存分区,分区创建完成

# 5. 刷新分区表,让系统识别新分区
partprobe /dev/sdb

2.4 磁盘格式化与永久挂载实战

分区完成后需格式化文件系统并挂载目录,临时挂载重启失效,生产环境必须配置永久挂载。

# 1. 格式化新分区为ext4文件系统(Linux主流格式)
mkfs -t ext4 /dev/sdb1

# 2. 创建挂载目录(自定义业务目录)
mkdir -p /home/project/data

# 3. 临时挂载(重启失效)
mount /dev/sdb1 /home/project/data

# 4. 配置永久挂载(修改开机自动挂载文件)
vim /etc/fstab
# 文件末尾添加挂载规则
/dev/sdb1  /home/project/data  ext4  defaults  0 0

# 5. 加载fstab配置,验证挂载无误
mount -a

# 6. 查看最终挂载结果
df -h

三、Linux系统状态监控命令

系统状态监控是Java服务故障排查、性能调优的核心能力,可实时查看系统资源、内核版本、登录状态、运行负载,快速定位CPU过载、内存溢出、服务器卡顿等问题。

3.1 系统版本与内核查询

# 查看系统内核完整信息
uname -a

# 仅查看内核版本
uname -r

# 查看CentOS系统详细发行版本
cat /etc/redhat-release

# 查看系统位数
getconf LONG_BIT

3.2 内存状态监控 free

核心作用:查看服务器物理内存、交换分区使用情况,排查Java服务内存溢出、内存泄漏问题。

# 人性化显示内存使用情况
free -h

# 定时刷新内存状态(每秒刷新一次)
free -hs 1

核心字段解析:total总内存、used已用内存、free空闲内存、buff/cache缓存内存、available可分配内存。Java服务部署需保证available内存充足,避免OOM内存溢出。

3.3 系统负载监控 uptime

核心作用:查看服务器运行时长、在线用户、1/5/15分钟平均负载,判断服务器CPU压力。负载值越低越好,生产环境长期不超过3,超过5表示CPU过载。

# 查看系统负载与运行状态
uptime

# 简洁展示负载信息
uptime -s

3.4 系统登录与操作日志监控

# 查看所有用户登录记录
last

# 查看指定用户登录日志
last root

# 查看历史执行命令(默认保存1000条)
history

# 清空当前用户命令历史(谨慎使用)
history -c

# 修改命令历史保存最大条数(临时生效)
export HISTSIZE=2000

四、Linux软件安装与包管理(Java环境必备)

Linux软件安装主流方式分为RPM离线安装、YUM在线安装、源码编译安装,Java开发所需的JDK、Tomcat、MySQL、Redis均通过三种方式部署,其中YUM为企业首选。

4.1 RPM包管理器(离线安装)

RPM是CentOS系统专属软件包管理工具,用于离线安装本地rpm后缀软件包,可精准查询、安装、卸载软件,缺点是无法自动解决依赖

4.1.1 核心命令实战

# 安装rpm软件包(显示详细进度)
rpm -ivh jdk-8u381-linux-x64.rpm

# 升级软件包
rpm -Uvh mysql-community-server-5.7.44-1.el7.x86_64.rpm

# 卸载软件(忽略依赖,强制卸载)
rpm -ev --nodeps jdk1.8.0

# 查询软件是否已安装
rpm -qa | grep jdk

# 查询软件安装路径与文件列表
rpm -ql mysql-community-server

# 查询文件所属软件包
rpm -qf /usr/bin/java

4.2 YUM在线包管理器(企业主流)

YUM基于RPM二次封装,核心优势是自动检测、下载、安装依赖包,一键完成软件安装、升级、卸载,无需手动处理依赖冲突,是生产环境首选安装方式。

4.2.1 YUM核心配置与源优化

YUM默认使用官方源,下载速度慢,企业统一更换阿里云镜像源,提升下载速度与稳定性。

# 1. 安装下载工具wget
yum install -y wget

# 2. 备份系统默认yum源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak

# 3. 下载阿里云CentOS7镜像源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

# 4. 清空旧缓存、生成新缓存
yum clean all
yum makecache

# 5. 查看可用yum仓库
yum repolist enabled

4.2.2 YUM高频实战命令

# 在线安装软件(自动解决依赖)
yum install -y tomcat mysql redis

# 卸载软件
yum remove -y tomcat

# 搜索可安装软件包
yum search jdk

# 查看已安装软件列表
yum list installed

# 更新系统所有软件(生产谨慎使用)
yum update -y

# 清理yum缓存
yum clean all

4.3 源码编译安装(高性能定制部署)

源码安装可自定义安装路径、编译参数,适配个性化业务需求,性能最优,适合Redis、Nginx、Tomcat等中间件定制部署,核心流程:解压→配置→编译→安装。

# 1. 安装编译依赖环境
yum install -y gcc gcc-c++ make cmake

# 2. 上传源码包至服务器,解压至/usr/local
tar -zxvf apache-tomcat-9.0.85.tar.gz -C /usr/local/
tar -zxvf redis-7.2.0.tar.gz -C /usr/local/

# 3. 进入源码目录编译安装(以Redis为例)
cd /usr/local/redis-7.2.0
make MALLOC=libc
make install

# 4. 配置全局环境变量
vim /etc/profile
# 末尾添加
export REDIS_HOME=/usr/local/redis-7.2.0
export PATH=$PATH:$REDIS_HOME/src

# 5. 生效环境变量
source /etc/profile

# 6. 验证安装
redis-server --version

五、Java核心环境部署实战(JDK+Tomcat+MySQL)

5.1 JDK8 环境完整部署

JDK是Java项目运行核心环境,生产统一使用JDK8稳定版本,采用源码解压+环境变量配置方式部署,无安装冗余。

# 1. 解压JDK安装包至系统软件目录
tar -zxvf jdk-8u381-linux-x64.tar.gz -C /usr/local/

# 2. 编辑全局环境变量配置文件
vim /etc/profile

# 3. 文件末尾追加JDK环境变量
export JAVA_HOME=/usr/local/jdk1.8.0_381
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH

# 4. 生效环境变量
source /etc/profile

# 5. 验证JDK部署成功
java -version
javac -version

5.2 Tomcat9 服务器部署

Tomcat是JavaWeb项目核心容器,部署后可运行War包、SpringBoot外置项目,配置环境变量实现全局调用。

# 1. 解压Tomcat源码包
tar -zxvf apache-tomcat-9.0.85.tar.gz -C /usr/local/
mv /usr/local/apache-tomcat-9.0.85 /usr/local/tomcat9

# 2. 配置Tomcat环境变量
vim /etc/profile
export TOMCAT_HOME=/usr/local/tomcat9
export PATH=$PATH:$TOMCAT_HOME/bin

source /etc/profile

# 3. 启停Tomcat服务
# 启动服务
startup.sh
# 停止服务
shutdown.sh

# 4. 查看Tomcat运行日志
tail -f /usr/local/tomcat9/logs/catalina.out

# 5. 开放8080端口防火墙
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload

5.3 MySQL5.7 数据库部署与配置

MySQL5.7是企业Java项目主流数据库,采用YUM在线部署,解决GPG校验报错、密码策略限制、远程连接等核心问题。

# 1. 下载MySQL5.7 yum源包
wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm

# 2. 安装yum源
rpm -ivh mysql57-community-release-el7-10.noarch.rpm

# 3. 安装MySQL(跳过GPG校验,解决安装报错)
yum install -y mysql-community-server --nogpgcheck

# 4. 启动MySQL并设置开机自启
systemctl start mysqld
systemctl enable mysqld

# 5. 查看初始临时密码
grep "password" /var/log/mysqld.log

# 6. 登录MySQL
mysql -uroot -p

# 7. 修改密码策略(适配简单密码,测试环境使用)
set global validate_password_policy=0;
set global validate_password_length=6;

# 8. 修改root管理员密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

# 9. 开启远程连接权限
update mysql.user set host='%' where user='root';
flush privileges;

# 10. 开放3306数据库端口
firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --reload

5.4 MySQL完整卸载流程(彻底清理残留)

部署失败、版本更换时需彻底卸载MySQL,清理所有配置、数据、依赖残留,避免冲突。

# 1. 停止MySQL服务
systemctl stop mysqld

# 2. 查询所有MySQL安装组件
rpm -qa | grep -i mysql

# 3. 强制卸载所有MySQL组件
rpm -ev --nodeps mysql57-community-release-el7-10.noarch
rpm -ev --nodeps mysql-community-server-5.7.44
rpm -ev --nodeps mysql-community-client-5.7.44
rpm -ev --nodeps mysql-community-common-5.7.44
rpm -ev --nodeps mysql-community-libs-5.7.44

# 4. 查找并删除所有MySQL残留文件
find / -name mysql
rm -rf /var/lib/mysql
rm -rf /etc/my.cnf
rm -rf /usr/share/mysql

# 5. 验证卸载完成
rpm -qa | grep -i mysql

六、Linux进程管理(Java服务运维核心)

进程是服务器运行的最小单元,Java项目、Tomcat、MySQL、Redis均以进程形式常驻后台运行,进程管理可实现服务启停、状态监控、异常查杀,是线上故障排查核心技能。

6.1 ps 静态进程查询命令

核心作用:一次性查询当前系统所有进程快照,静态展示进程状态,用于查询Java、中间件进程PID。

# 查看所有完整进程信息
ps -aux

# 精准查询Java进程(排查项目进程是否启动)
ps -aux | grep java

# 查询Tomcat、MySQL进程
ps -aux | grep tomcat
ps -aux | grep mysql

# 过滤僵尸进程
ps -aux | grep Z

6.1.1 进程状态解析

  • R:运行状态,进程正在占用CPU执行任务

  • S:睡眠状态,进程等待资源,正常常驻后台服务状态

  • T:暂停状态,进程被手动暂停

  • Z:僵尸状态,进程已终止但资源未释放,需手动查杀

6.2 top 动态系统监控命令

核心作用:实时动态监控系统进程、CPU、内存、负载状态,相当于Linux任务管理器,持续监控Java服务资源占用。

# 默认3秒刷新一次全局监控
top

# 每秒刷新一次监控数据
top -d 1

# 仅监控指定PID的Java进程
top -p 12580

# 按内存占用排序(默认CPU排序)
top -o %MEM

6.3 kill 进程查杀命令

核心作用:终止异常进程、重启服务,分为普通终止和强制终止,生产优先使用温和终止方式。

# 温和终止进程(等待进程释放资源、优雅退出)
kill 12580

# 强制终止进程(进程卡死、无响应时使用)
kill -9 12580

# 批量查杀所有Java进程
killall -9 java

# 查杀所有Tomcat进程
killall -9 tomcat

七、网络端口与服务管理

7.1 网络状态查询命令

用于排查端口占用、服务无法访问、网络连接异常等问题,Java项目端口冲突、接口不通均通过此类命令排查。

# 查看网卡配置、IP地址
ip addr

# 查看所有端口监听状态
netstat -atnlp

# 精准查询指定端口占用情况(排查8080、3306、6379端口)
netstat -tulpn | grep 8080

# 通过端口查询对应进程PID
lsof -i:8080

# 查看TCP/UDP连接状态
netstat -st
netstat -su

7.2 系统服务启停管理(systemctl)

CentOS7+默认使用systemd管理系统服务,替代传统service/chkconfig命令,统一管理所有后台服务启停、开机自启。

# 启动服务
systemctl start mysqld
systemctl start redis

# 停止服务
systemctl stop mysqld

# 重启服务
systemctl restart mysqld

# 查看服务运行状态
systemctl status mysqld

# 设置开机自启
systemctl enable mysqld

# 关闭开机自启
systemctl disable mysqld

# 查看所有开机自启服务
systemctl list-unit-files --type=service | grep enabled

八、定时任务与防火墙配置

8.1 Crontab 定时任务实战

定时任务用于执行周期性业务,如凌晨备份数据库、定时清理项目日志、定时同步数据,是Java项目运维必备功能。

8.1.1 定时任务语法规范

语法格式:分 时 日 月 周 执行命令,*代表任意时间,-代表范围,,代表多时段,/代表间隔

8.1.2 实战定时任务案例

# 编辑当前用户定时任务
crontab -e

# 每日凌晨2点清理Tomcat日志
0 2 * * * rm -rf /usr/local/tomcat9/logs/*.out

# 每周一、三、五凌晨3点备份MySQL数据库
0 3 * * 1,3,5 /usr/local/mysql/bin/mysqldump -uroot -p123456 test > /home/backup/test_$(date +\%Y\%m\%d).sql

# 每10分钟同步系统时间
*/10 * * * * ntpdate time.aliyun.com

# 每月1号凌晨4点清理磁盘临时文件
0 4 1 * * rm -rf /tmp/*

# 查看当前用户定时任务
crontab -l

# 删除所有定时任务
crontab -r

8.2 Firewalld 防火墙配置

防火墙用于管控服务器端口访问权限,默认拦截所有外部端口,Java项目部署后需手动放行对应端口,保证外部可访问。

# 查看防火墙状态
firewall-cmd --state

# 查看所有放行端口与服务
firewall-cmd --list-all

# 放行指定端口(永久生效)
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --add-port=6379/tcp --permanent

# 放行http/https服务
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent

# 移除指定端口
firewall-cmd --remove-port=8080/tcp --permanent

# 重载防火墙配置(修改后必须执行)
firewall-cmd --reload

# 设置默认防火墙区域
firewall-cmd --set-default-zone=public

九、SELinux安全机制与系统安全优化

SELinux是Linux内核级安全防护机制,默认强制开启,会拦截端口访问、文件读写、服务调用,导致Java项目、数据库无法正常访问,生产环境一般临时或永久关闭。

# 查看SELinux当前运行模式
getenforce

# 临时关闭SELinux(重启失效)
setenforce 0

# 永久关闭SELinux
vim /etc/selinux/config
# 修改配置
SELINUX=disabled

# 重启系统生效
reboot

SELinux三种模式:enforcing强制拦截、permissive警告不拦截、disabled完全关闭,开发测试环境建议关闭,生产严格环境可按需配置权限。

十、Java项目线上日志排查与服务自启动配置

Java项目部署到Linux服务器后,日常运维核心工作为日志异常排查服务持久自启。日志排查可快速定位空指针、接口报错、OOM溢出、数据库连接异常等线上问题;服务自启动可保障服务器重启、程序崩溃后项目自动恢复,避免人工手动重启,是生产环境必备运维能力。

10.1 Java项目核心日志类型与存储规范

Linux环境下Java项目日志分为框架日志、业务日志、服务器容器日志三大类,所有日志默认存储在固定目录,排查问题需精准区分日志场景,避免无效排查。

  • Tomcat容器日志:存放Tomcat运行、项目启动、端口异常、全局异常日志,路径为 /usr/local/tomcat9/logs/,核心文件为 catalina.out(全局日志,排查项目启动失败首选)。

  • SpringBoot内置日志:独立项目无Tomcat依赖,日志默认位于项目jar包同级目录,可通过配置文件自定义 log.path 日志存储路径,核心文件为 info.logerror.log

  • Java业务自定义日志:项目代码中通过Logback、Log4j2打印的业务日志,包含接口请求、参数异常、业务逻辑报错、事务失败等核心业务信息,是排查业务bug的关键依据。

  • 系统运行日志:服务器层面日志,排查内存溢出、进程被杀、系统资源不足导致的项目宕机问题,路径 /var/log/messages

10.2 高频日志排查实战命令

结合Linux文本查询命令,针对性筛选Java项目报错、异常堆栈、超时请求等关键信息,适配线上快速排查场景,所有命令为生产高频使用。

10.2.1 实时监控项目运行日志

# 实时滚动查看Tomcat全局日志(线上实时监控项目启动、运行报错)
tail -f /usr/local/tomcat9/logs/catalina.out

# 实时监控SpringBoot项目日志
tail -f /home/project/java-demo/logs/info.log

# 实时监控并只输出错误日志(过滤无效信息)
tail -f /home/project/java-demo/logs/info.log | grep ERROR

10.2.2 精准筛选异常与报错信息

# 查询日志中所有异常堆栈信息(Exception)
grep -i "Exception" /usr/local/tomcat9/logs/catalina.out

# 查询空指针异常(高频业务报错)
grep -i "NullPointerException" /home/project/java-demo/logs/error.log

# 查询OOM内存溢出异常
grep -i "OutOfMemoryError" /usr/local/tomcat9/logs/catalina.out

# 统计当日报错总次数,定位异常频率
grep -i "ERROR" /home/project/java-demo/logs/info.log | grep "$(date +%Y-%m-%d)" | wc -l

10.2.3 时间段日志精准查询

用于排查指定时间段的线上故障,如某个时间点接口宕机、业务报错,精准定位问题根源。

# 查询2026-05-21 10:00-11:00之间的所有报错日志
sed -n '/2026-05-21 10:00:00/,/2026-05-21 11:00:00/p' /home/project/java-demo/logs/info.log | grep ERROR

# 导出指定时间段异常日志到文件,方便分析
sed -n '/2026-05-21 00:00:00/,/2026-05-21 23:59:59/p' catalina.out > 20260521-error.log

10.2.4 日志大文件快速排查技巧

生产环境日志文件动辄几个GB,禁止直接打开文件,需通过命令快速检索关键信息,避免服务器卡顿。

# 查看日志最后100行最新报错(优先看最新异常)
tail -n 100 /usr/local/tomcat9/logs/catalina.out | grep ERROR

# 查看日志前100行启动初始化日志,排查启动失败问题
head -n 100 /usr/local/tomcat9/logs/catalina.out

# 分页查看所有异常日志,逐行分析
grep -i "Exception" catalina.out | more

10.3 日志清理与自动归档(防止磁盘爆满)

Java项目日志持续累加,长期不清理会导致服务器磁盘使用率过高、项目写入失败,需配置定时任务自动清理过期日志。

# 手动清理30天前的日志文件
find /home/project/java-demo/logs/ -name "*.log" -mtime +30 -delete
find /usr/local/tomcat9/logs/ -name "*.out" -o -name "*.log" -mtime +30 -delete

# 配置定时任务:每日凌晨3点自动清理30天前日志
crontab -e
# 追加以下规则
0 3 * * * find /home/project/java-demo/logs/ -name "*.log" -mtime +30 -delete && find /usr/local/tomcat9/logs/ -mtime +30 -delete

10.4 Java项目服务自启动配置(生产必备)

服务器意外重启、进程崩溃后,默认需要手动启动Java项目,通过配置 systemctl系统服务 实现项目开机自启、异常重启、统一启停管理,适配CentOS7+所有版本,稳定性远超脚本自启。

10.4.1 编写Java项目启动脚本

先创建项目启动脚本,统一定义项目路径、JDK路径、启停逻辑,避免服务配置冗余。

# 1. 创建脚本存放目录
mkdir -p /usr/local/java-service

# 2. 创建项目启停脚本
vim /usr/local/java-service/demo-service.sh

脚本完整内容(适配SpringBoot Jar包项目,可直接复用):

#!/bin/bash
# JDK环境路径
JAVA_HOME=/usr/local/jdk1.8.0_381
# 项目Jar包路径
JAR_PATH=/home/project/java-demo/demo.jar
# 项目日志输出路径
LOG_PATH=/home/project/java-demo/logs/start.log

case $1 in
start)
    # 后台启动项目,输出日志
    nohup $JAVA_HOME/bin/java -jar $JAR_PATH >> $LOG_PATH 2>&1 &
    echo "Java项目启动成功"
    ;;
stop)
    # 查杀项目进程
    PID=$(ps -aux | grep $JAR_PATH | grep -v grep | awk '{print $2}')
    if [ -n "$PID" ]; then
        kill -9 $PID
        echo "Java项目停止成功"
    fi
    ;;
restart)
    $0 stop
    sleep 2
    $0 start
    echo "Java项目重启成功"
    ;;
status)
    PID=$(ps -aux | grep $JAR_PATH | grep -v grep | awk '{print $2}')
    if [ -n "$PID" ]; then
        echo "项目运行中,PID:$PID"
    else
        echo "项目未运行"
    fi
    ;;
esac

10.4.2 授权脚本并测试启停

# 赋予脚本执行权限
chmod +x /usr/local/java-service/demo-service.sh

# 测试启动项目
/usr/local/java-service/demo-service.sh start

# 测试停止项目
/usr/local/java-service/demo-service.sh stop

# 测试重启项目
/usr/local/java-service/demo-service.sh restart

# 查看项目状态
/usr/local/java-service/demo-service.sh status

10.4.3 配置systemctl开机自启服务

在systemctl服务目录创建服务配置文件,实现系统统一管理、开机自启、异常自动重启。

# 创建系统服务配置文件
vim /etc/systemd/system/demo-java.service

服务配置文件完整内容:

[Unit]
# 服务描述
Description=Java Demo Project Service
# 依赖网络启动
After=network.target

[Service]
# 运行用户
User=root
# 启动命令
ExecStart=/usr/local/java-service/demo-service.sh start
# 停止命令
ExecStop=/usr/local/java-service/demo-service.sh stop
# 重启命令
ExecReload=/usr/local/java-service/demo-service.sh restart
# 服务异常、进程退出时自动重启
Restart=always
# 重启间隔时间(秒)
RestartSec=5

[Install]
# 系统开机自动激活服务
WantedBy=multi-user.target

10.4.4 加载配置并启用自启

# 重新加载系统服务配置
systemctl daemon-reload

# 设置开机自启
systemctl enable demo-java

# 启动Java项目服务
systemctl start demo-java

# 查看服务运行状态
systemctl status demo-java

# 关闭开机自启(如需取消)
systemctl disable demo-java

10.5 自启动服务故障排查要点

  • 服务启动失败:执行 journalctl -u demo-java -f 查看服务详细启动日志,排查Jar包路径错误、权限不足、端口占用问题。

  • 开机不自启:检查服务是否设置enable、系统网络是否正常、JDK路径是否配置正确。

  • 频繁自动重启:排查项目本身是否存在报错、端口冲突、内存溢出,导致进程频繁崩溃重启。

  • 权限报错:确保启动脚本、Jar包目录拥有足够执行权限,可执行 chmod 755 项目路径 授权。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐