在服务器运维过程中,管理正在运行的 Java 应用程序是一项常见任务,当应用以 JAR 包的形式部署在 CentOS 系统上时,我们时常需要对其进行停止操作,例如为了更新版本、释放系统资源或进行故障排查,本文将详细介绍在 CentOS 系统中停止运行 JAR 包的几种主流方法,从基础的进程查杀到优雅的服务管理,并提供最佳实践建议。
常规方法:查找进程并终止
这是最直接的方法,适用于通过 nohup java -jar ... &
等命令直接启动的 JAR 程序,其核心分为两步:找到进程,然后终止它。
查找 Java 进程 ID (PID)
在终止进程之前,必须先获取其唯一的进程标识符(PID),以下是几种常用的查找方式:
这是最经典的方法。ps aux
会列出所有正在运行的进程,然后通过管道 将结果传递给grep
,筛选出包含你的 JAR 包名的行。ps aux | grep your-application.jar
输出结果中,第二列就是 PID。
grep
命令本身也会出现在列表中,通常可以通过grep -v grep
来过滤掉它,或者直接识别目标进程。jps
(Java Virtual Machine Process Status Tool)是 JDK 自带的一个小工具,专门用于列出 Java 进程,非常简洁。jps -l
-l
参数会显示完整的包名或 JAR 文件名,方便你识别,输出的第一列即为 PID。
如果你知道 JAR 应用监听的端口号(8080),可以使用lsof
(List Open Files)来查找占用该端口的进程。lsof -i :8080
命令输出中,
PID
这一列会明确显示进程 ID。
终止进程
获取 PID 后,就可以使用 kill
命令来终止进程。
kill
命令默认发送TERM
信号(信号编号 15),它会请求进程正常退出,这允许应用程序完成当前正在处理的任务、关闭资源、保存状态,是一种“优雅”的停止方式。kill <PID> # kill 12345
如果进程无响应,无法通过kill
命令正常停止,可以使用kill -9
,它发送KILL
信号(信号编号 9),会立即终止进程,不给它任何清理的机会,这可能导致数据丢失或状态不一致,应作为最后手段使用。kill -9 <PID> # kill -9 12345
推荐方法:使用 Systemd 管理服务
对于生产环境,将 JAR 应用配置为 systemd
服务是最佳实践。systemd
是 CentOS 7 及以上版本标准的系统和服务管理器,它能提供自动重启、日志管理、开机自启等强大功能。
创建 .service 文件
在 /etc/systemd/system/
目录下创建一个服务单元文件,your-app.service
。
sudo vim /etc/systemd/system/your-app.service
示例如下:
[Unit] Description=My Java Application Service After=syslog.target network.target [Service] User=your-user # 运行该服务的用户 Group=your-group # 运行该服务的用户组 ExecStart=/usr/bin/java -jar /path/to/your-application.jar SuccessExitStatus=143 Restart=on-failure RestartSec=10 [Install] WantedBy=multi-user.target
关键配置说明:
Description
: 服务的描述信息。User/Group
: 指定运行服务的用户和组,增强安全性。ExecStart
: 启动服务的完整命令。SuccessExitStatus=143
: Java 应用接收到SIGTERM
(即kill
命令发送的信号)时,退出码通常是 143,将其标记为成功退出,避免systemd
认为服务失败而重启。Restart=on-failure
: 在服务异常退出时自动重启。
管理服务
创建并保存文件后,执行以下命令来管理你的应用:
# 重新加载 systemd 配置,使其识别新服务 sudo systemctl daemon-reload # 启动服务 sudo systemctl start your-app # 停止服务 (优雅停止) sudo systemctl stop your-app # 查看服务状态 sudo systemctl status your-app # 设置服务开机自启 sudo systemctl enable your-app
使用 systemctl stop
命令时,它会向服务发送 SIGTERM
信号,实现优雅停止,这是管理 JAR 应用最规范、最可靠的方式。
方法对比
方法 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
查找并 Kill | 简单直接,无需额外配置 | 手动操作,易出错;无法自动重启;进程管理混乱 | 临时测试、快速调试、非关键应用 |
Systemd 服务 | 自动化管理(启停、重启、日志);稳定可靠;标准化操作 | 需要初始配置 .service 文件 | 生产环境、长期运行的关键应用 |
小编总结与建议
在 CentOS 上停止运行 JAR 包,虽然 kill
命令能够解决问题,但对于任何需要稳定运行的 Java 应用,强烈建议采用 systemd
进行服务化管理,它不仅简化了 centos 停止运行jar
的操作,将其标准化为 systemctl stop
,更提供了全面的进程生命周期管理,是现代 Linux 服务器运维的基石。
相关问答 (FAQs)
解答: 这种情况通常意味着你的 JAR 应用被一个进程管理器(如 systemd
、Supervisor
或 Docker
)所监控,当你使用 kill -9
强制杀死进程后,管理器会检测到进程异常退出,并根据其配置(如 Restart=on-failure
)自动重启它,正确的做法是使用管理器提供的停止命令,sudo systemctl stop your-app.service
,这样管理器会知道这是你主动发起的正常停止,不会尝试重启。
我忘记了 JAR 包的启动命令和文件名,如何找到并停止它?
解答: 如果你忘记了 JAR 包的名称,可以尝试以下几种方法:
- 按端口查找: 如果你知道应用使用的端口,使用
lsof -i :端口号
命令可以快速定位到进程及其 PID。 - 按用户查找: 如果你知道是以哪个用户身份运行的,可以使用
ps -u 用户名 -f
来查看该用户启动的所有进程。 - 查看所有 Java 进程: 使用
jps -l
或ps aux | grep java
列出系统上所有的 Java 进程,然后根据路径或名称来识别你的应用,找到 PID 后,即可使用kill
命令停止它。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复