Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何优雅地停止java进程?

如何优雅地停止java进程?
EN

Stack Overflow用户
提问于 2008-10-10 05:17:36
回答 7查看 134.4K关注 0票数 90

如何在Linux和Windows中优雅地停止Java进程?

什么时候调用Runtime.getRuntime().addShutdownHook,什么时候不调用呢?

那么终结器呢,它们在这里有帮助吗?

我可以从shell向Java进程发送某种信号吗?

我正在寻找更好的便携式解决方案。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2008-10-10 07:47:23

在VM未被强制终止的所有情况下,都会执行关闭钩子。因此,如果您发出一个“标准”kill (来自kill命令的SIGTERM),那么它们将被执行。类似地,它们将在调用System.exit(int)之后执行。

但是,如果是硬杀(kill -9kill -SIGKILL),那么它们就不会执行。同样(显然),如果你从计算机中拔出电源,将其放入一大桶沸腾的熔岩中,或者用大锤将CPU打成碎片,它们就不会执行。不过,您可能已经知道了。

Finalizer确实也应该运行,但最好不要依赖于它来进行关机清理,而是依靠你的关机钩子来干净地停止事情。而且,和往常一样,要小心死锁(我见过太多的关闭钩子挂起了整个过程)!

票数 84
EN

Stack Overflow用户

发布于 2008-10-16 06:36:02

好了,在我选择了使用"Java监控和管理“的所有可能性之后

Overview is here

这允许您以相对简单的方式从一个应用程序控制另一个应用程序。您可以从脚本调用控制应用程序,以便在终止受控应用程序之前优雅地停止它。

以下是简化的代码:

控制的应用程序:

使用以下VM参数运行它:

-Dcom.sun.management.jmxremote

-Dcom.sun.management.jmxremote.port=9999

-Dcom.sun.management.jmxremote.authenticate=false

-Dcom.sun.management.jmxremote.ssl=false

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//ThreadMonitorMBean.java
public interface ThreadMonitorMBean
{
String getName();
void start();
void stop();
boolean isRunning();
}

// ThreadMonitor.java
public class ThreadMonitor implements ThreadMonitorMBean
{
private Thread m_thrd = null;

public ThreadMonitor(Thread thrd)
{
    m_thrd = thrd;
}

@Override
public String getName()
{
    return "JMX Controlled App";
}

@Override
public void start()
{
    // TODO: start application here
    System.out.println("remote start called");
}

@Override
public void stop()
{
    // TODO: stop application here
    System.out.println("remote stop called");

    m_thrd.interrupt();
}

public boolean isRunning()
{
    return Thread.currentThread().isAlive();
}

public static void main(String[] args)
{
    try
    {
        System.out.println("JMX started");

        ThreadMonitorMBean monitor = new ThreadMonitor(Thread.currentThread());

        MBeanServer server = ManagementFactory.getPlatformMBeanServer();

        ObjectName name = new ObjectName("com.example:type=ThreadMonitor");

        server.registerMBean(monitor, name);

        while(!Thread.interrupted())
        {
            // loop until interrupted
            System.out.println(".");
            try 
            {
                Thread.sleep(1000);
            } 
            catch(InterruptedException ex) 
            {
                Thread.currentThread().interrupt();
            }
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
    finally
    {
        // TODO: some final clean up could be here also
        System.out.println("JMX stopped");
    }
}
}

控制应用程序:

使用stop或start作为命令行参数运行它

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ThreadMonitorConsole
{

public static void main(String[] args)
{
    try
    {   
        // connecting to JMX
        System.out.println("Connect to JMX service.");
        JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:9999/jmxrmi");
        JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
        MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();

        // Construct proxy for the the MBean object
        ObjectName mbeanName = new ObjectName("com.example:type=ThreadMonitor");
        ThreadMonitorMBean mbeanProxy = JMX.newMBeanProxy(mbsc, mbeanName, ThreadMonitorMBean.class, true);

        System.out.println("Connected to: "+mbeanProxy.getName()+", the app is "+(mbeanProxy.isRunning() ? "" : "not ")+"running");

        // parse command line arguments
        if(args[0].equalsIgnoreCase("start"))
        {
            System.out.println("Invoke \"start\" method");
            mbeanProxy.start();
        }
        else if(args[0].equalsIgnoreCase("stop"))
        {
            System.out.println("Invoke \"stop\" method");
            mbeanProxy.stop();
        }

        // clean up and exit
        jmxc.close();
        System.out.println("Done.");    
    }
    catch(Exception e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

就这样。:-)

票数 47
EN

Stack Overflow用户

发布于 2009-06-17 07:19:04

另一种方式:您的应用程序可以打开服务器socet并等待收到的信息。例如,一个带有“魔术”单词:)的字符串,然后反应生成shutdown: System.exit()。您可以使用telnet等外部应用程序将此类信息发送到套接字。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/191215

复制
相关文章
如何优雅地停止Java进程
我们知道,Java程序的运行需要一个运行时环境,即:JVM,启动Java进程即启动了一个JVM。 因此,所谓停止Java进程,本质上就是关闭JVM。 那么,哪些情况会导致JVM关闭呢?
编程随笔
2019/06/27
6.4K0
如何优雅地停止Java进程
安全优雅地停止Java线程
这道问题的背后,可以很小,小到只是简单终止一个Thread线程,也可以很大,大到例如Dubbo应用的优雅下线......它们其实都有一个共同之处,即非一刀断式地暴力停止某个进程或者线程,而是能够实现在终止过程中,有机会去清理资源,跑完剩余的任务,最后没有任何资源在运行了,才做最后结束,这才算安全而优雅地停止。
朱季谦
2021/12/05
7890
如何优雅地停止 Spring Boot 应用?
首先来介绍下什么是优雅地停止,简而言之,就是对应用进程发送停止指令之后,能保证正在执行的业务操作不受影响,可以继续完成已有请求的处理,但是停止接受新请求。
武培轩
2020/06/10
1.5K0
如何优雅地停止 Spring Boot 应用?
首先来介绍下什么是优雅地停止,简而言之,就是对应用进程发送停止指令之后,能保证正在执行的业务操作不受影响,可以继续完成已有请求的处理,但是停止接受新请求。
用户1516716
2020/06/17
1.9K0
如何优雅地停止 Spring Boot 应用?
如何优雅地停止 Spring Boot 应用?
首先来介绍下什么是优雅地停止,简而言之,就是对应用进程发送停止指令之后,能保证正在执行的业务操作不受影响,可以继续完成已有请求的处理,但是停止接受新请求。
武培轩
2020/06/09
1.1K0
如何优雅地停止 Spring Boot 应用?
Linux系统下如何优雅地关闭Java进程?
Linux系统下如何kill掉一个后台Java进程,相信童鞋们都知道如何操作。首先使用ps命令查找该Java进程的进程ID,然后使用kill命令进行杀掉。命令如下:
用户6543014
2019/10/25
5.4K0
Linux系统下如何优雅地关闭Java进程?
Kubernetes 中如何保证优雅地停止 Pod
一直以来我对优雅地停止 Pod 这件事理解得很单纯:不就利用是 PreStop hook 做优雅退出吗?但最近发现很多场景下 PreStop Hook 并不能很好地完成需求,这篇文章就简单分析一下“优雅地停止 Pod”这回事儿。
PingCAP
2019/04/02
8.5K0
如何优雅地关闭worker进程?
之前我们讲解 Nginx 命令行的时候,可以看到 Nginx 停止有两种方式,分别是 nginx -s quit 和 nginx -s stop,其中 stop 是指立即停止 Nginx,而 quit 是指优雅的关闭 Nginx,对应的信号也是同样的,还有我们之前提到的 reload 和热升级这样的过程中都涉及到了优雅的停止 Nginx。
武培轩
2019/12/24
2.5K0
Kubernetes 中如何保证优雅地停止 Pod
一直以来我对优雅地停止 Pod 这件事理解得很单纯:不就利用是 PreStop Hook 做优雅退出吗?但最近发现很多场景下 PreStop Hook 并不能很好地完成需求,这篇文章就简单分析一下“优雅地停止 Pod”这回事儿。
CNCF
2019/12/04
2.1K0
Kubernetes 中如何保证优雅地停止 Pod
如何优雅停止 Springboot 运行
可以看到 Springboot 启动后,进程 PID 44559,现在使用 kill 命令杀死这个进程
netkiller old
2021/08/20
7K0
如何优雅停止Windows远程
以往操作Windows,我总以为命令才是最优雅的,没想到在停止/重启远程服务上经常翻车,发现还是得加上图形界面才靠谱
Windows技术交流
2023/09/15
3230
java 如何优雅的停止一个线程
写过多线程的童鞋,可能都会遇到一个问题,那就是线程如何优雅的停止。这里主要介绍两个办法:标志位 和 thread.isInterrupted。
shengjk1
2020/01/14
1.6K0
在 Java 中如何优雅地判空
  作为搬砖党的一族们,我们对判空一定再熟悉不过了,不要跟我说你很少进行判空,除非你喜欢NullPointerException。
芋道源码
2019/11/21
2.4K0
java程序 如何优雅地读取xml文件
实例xml <?xml version="1.0" encoding="UTF-8"?> <c c1="0"> <d d1="101280101" d2="广州" d3="guangzhou" d
Meet相识
2018/09/12
2.9K0
Java如何优雅地实现接口数据校验
本篇文章给大家分享平时开发中总结的一点小技巧!在工作中写过Java程序的朋友都知道,目前使用Java开发服务最主流的方式就是通过Spring MVC定义一个Controller层接口,并将接口请求或返回参数分别定义在一个Java实体类中,这样Spring MVC在接收到Http请求(POST/GET)后,就会自动将请求报文自动映射成一个Java对象。这样的代码通常是这样写的:
用户5927304
2020/12/11
1.2K0
Java如何优雅地实现接口数据校验
在Java中如何优雅地判空
作为搬砖党的一族们,我们对判空一定再熟悉不过了,不要跟我说你很少进行判空,除非你喜欢 NullPointerException。
JAVA葵花宝典
2019/11/15
1.4K0
批量启动停止Java进程
解决的问题: 公司目前测试环境只有几台虚拟机,没有进行容器化管理,系统采用分布式架构,需要部署的程序很多。 一旦虚拟机重启或者故障就要适用Jenkins重启打包部署非常耗时和麻烦,遂编写该脚本用于定时抓取Java进程启动信息, 一旦出现故障,可以批量停止Java进程或者批量启动Java进程。
py3study
2020/01/02
1.7K0
SparkStreaming如何优雅的停止服务
我们都知道SparkStreaming程序是一个长服务,一旦运转起来不会轻易停掉,那么如果我们想要停掉正在运行的程序应该怎么做呢? 如果运行的是spark on yarn模式直接使用 yarn application -kill taskId 暴力停掉sparkstreaming是有可能出现问题的,比如你的数据源是kafka,已经加载了一批数据到sparkstreaming中正在处理,如果中途停掉,这个批次的数据很有可能没有处理完,就被强制stop了,下次启动时候会重复消费或者部分数据丢失。 如何解决?
我是攻城师
2018/05/14
2.1K0
如何优雅地打印一个Java对象?
你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。虽然已经写了十多年的 Java 代码,但仍然觉得自己是个菜鸟(请允许我惭愧一下)。
沉默王二
2020/02/17
1.8K0
如何优雅地链式取值
但是对于这种操作报出类似于Uncaught TypeError: Cannot read property 'goods' of undefined 这种错误也是再正常不过了,如果说是res数据是自己定义,那么可控性会大一些,但是如果这些数据来自于不同端(如前后端),那么这种数据对于我们来说我们都是不可控的,因此为了保证程序能够正常运行下去,我们需要对此校验:
用户1515472
2019/07/24
1.1K0

相似问题

在Kubernetes中优雅地停止Java进程?

34

如何优雅地停止java线程?

61

使用子进程优雅地停止python守护进程

10

优雅地停止maven-antrun-plugin启动的java进程。

21

如何按顺序优雅地停止java线程?

40
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文