当前位置:首页 > 主机动态 > 正文

Java jar命令如何正确终止运行?

执行Java的jar程序后,若主线程结束会自动退出,强制退出可:1.命令行窗口按Ctrl+C终止进程;2.关闭启动终端;3.代码中使用System.exit(0),后台运行时需通过kill命令终止对应PID进程。

当通过 java -jar 命令运行一个Java应用程序时,用户常会遇到需要主动退出的场景,不同的运行方式和环境会影响退出方法的选择,以下详细说明几种安全退出的方法及注意事项,帮助用户根据实际情况灵活操作。


直接退出交互式运行的程序

如果通过命令行直接启动JAR包(java -jar app.jar),程序会在当前终端中运行并占用交互界面,此时可通过以下方式退出:

  1. 使用快捷键

    按下 Ctrl + C(Windows/Linux/macOS通用):

    • 向程序发送 SIGINT 信号,触发优雅终止。
    • 如果程序监听了该信号,会执行资源清理(如关闭数据库连接、保存临时文件)后退出。
  2. 输入关闭命令(如果程序支持)

    部分Java程序(如Spring Boot应用)内置了关闭指令,在运行中的Spring Boot终端输入:

    Java jar命令如何正确终止运行? 第1张

    curl -X POST localhost:端口号/actuator/shutdown

    需确保程序已启用Actuator端点并配置了权限


结束后台运行的Java进程

若程序是通过 nohup 或 & 在后台运行(nohup java -jar app.jar &),需通过进程管理命令终止。

方法1:通过进程ID(PID)终止

  1. 查找进程ID

    Java jar命令如何正确终止运行? 第2张

  2. 终止进程

    • 普通终止(允许程序回收资源): kill <PID> # Linux/macOS taskkill /PID <PID> # Windows
    • 强制终止(立即结束,可能导致数据丢失): kill -9 <PID> # Linux/macOS taskkill /F /PID <PID> # Windows
    • 方法2:使用进程名批量终止

      pkill -f app.jar # Linux/macOS(匹配包含app.jar的进程)


      通过程序内部逻辑退出

      开发者可以在代码中预设退出机制:

      1. 监听控制台输入

        输入exit后调用System.exit(0):

        Java jar命令如何正确终止运行? 第3张

        Scanner scanner = new Scanner(System.in); while (true) { String input = scanner.nextLine(); if ("exit".equalsIgnoreCase(input)) { System.exit(0); // 0表示正常退出 } }
      2. 响应系统信号

        注册Shutdown Hook实现安全退出:

        Runtime.getRuntime().addShutdownHook(new Thread(() -> { System.out.println("执行清理操作..."); }));


      注意事项

      1. 数据安全

        • 优先使用Ctrl + C或普通kill命令,避免强制终止导致数据损坏。
        • 后台程序建议通过PID终止而非直接关闭终端。
      2. 信号差异

        | 信号 | 效果 | 适用场景 |

        |———|———————–|————————|

        | SIGINT | 优雅退出(Ctrl+C) | 交互式程序 |

        | SIGTERM | 请求终止(默认kill) | 后台进程 |

        | SIGKILL | 强制终止(kill -9) | 程序无响应时最后手段 |

      3. 工具推荐

        • jps:JDK自带工具,快速查看Java进程ID。
        • htop(Linux):图形化进程管理工具。
        • 退出java -jar命令的核心在于根据程序运行环境选择合适的方式,对于普通用户,推荐优先使用Ctrl + C或查找PID后终止;开发者则应通过代码逻辑实现可控退出,无论哪种场景,都需确保程序资源正确释放,避免异常中断。


          引用说明

          • Java官方文档:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
          • Linux信号列表:https://man7.org/linux/man-pages/man7/signal.7.html
          • Spring Boot Actuator:https://spring.io/guides/gs/actuator-service/

0