CentOS如何彻底停止一个正在后台运行的jar包?

在服务器运维过程中,管理正在运行的 Java 应用程序是一项常见任务,当应用以 JAR 包的形式部署在 CentOS 系统上时,我们时常需要对其进行停止操作,例如为了更新版本、释放系统资源或进行故障排查,本文将详细介绍在 CentOS 系统中停止运行 JAR 包的几种主流方法,从基础的进程查杀到优雅的服务管理,并提供最佳实践建议。

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)来查找占用该端口的进程。

    CentOS如何彻底停止一个正在后台运行的jar包?

    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

示例如下:

CentOS如何彻底停止一个正在后台运行的jar包?

[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 应用被一个进程管理器(如 systemdSupervisorDocker)所监控,当你使用 kill -9 强制杀死进程后,管理器会检测到进程异常退出,并根据其配置(如 Restart=on-failure)自动重启它,正确的做法是使用管理器提供的停止命令,sudo systemctl stop your-app.service,这样管理器会知道这是你主动发起的正常停止,不会尝试重启。

我忘记了 JAR 包的启动命令和文件名,如何找到并停止它?
解答: 如果你忘记了 JAR 包的名称,可以尝试以下几种方法:

  1. 按端口查找: 如果你知道应用使用的端口,使用 lsof -i :端口号 命令可以快速定位到进程及其 PID。
  2. 按用户查找: 如果你知道是以哪个用户身份运行的,可以使用 ps -u 用户名 -f 来查看该用户启动的所有进程。
  3. 查看所有 Java 进程: 使用 jps -lps aux | grep java 列出系统上所有的 Java 进程,然后根据路径或名称来识别你的应用,找到 PID 后,即可使用 kill 命令停止它。

【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!

(0)
热舞的头像热舞
上一篇 2025-10-03 08:49
下一篇 2025-10-03 08:53

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

QQ-14239236

在线咨询: QQ交谈

邮件:asy@cxas.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信