首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在Eclipse启动的进程上执行shutdown hook

在Eclipse启动的进程上执行shutdown hook,可以通过以下步骤实现:

  1. 在Eclipse中创建一个Java项目。
  2. 在项目中创建一个Java类,例如命名为ShutdownHookExample
  3. ShutdownHookExample类中,添加以下代码:
代码语言:java
复制
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class ShutdownHookExample {
    public static void main(String[] args) {
        // 创建一个单线程的线程池
        ExecutorService executor = Executors.newSingleThreadExecutor();

        // 提交一个任务到线程池中
        executor.submit(() -> {
            try {
                System.out.println("任务正在执行...");
                TimeUnit.SECONDS.sleep(5);
                System.out.println("任务执行完毕");
            } catch (InterruptedException e) {
                System.out.println("任务被中断");
            }
        });

        // 添加一个关闭钩子,在JVM关闭时执行
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            System.out.println("执行关闭钩子");
            executor.shutdown();
            try {
                // 等待线程池关闭
                executor.awaitTermination(5, TimeUnit.SECONDS);
            } catch (InterruptedException e) {
                System.out.println("线程池关闭被中断");
            }
            System.out.println("关闭钩子执行完毕");
        }));

        // 主线程休眠10秒钟,然后退出
        try {
            TimeUnit.SECONDS.sleep(10);
        } catch (InterruptedException e) {
            System.out.println("主线程被中断");
        }
    }
}
  1. 运行ShutdownHookExample类的main方法。
  2. 在运行过程中,按下Ctrl+C,即可触发关闭钩子的执行。

通过以上步骤,可以在Eclipse启动的进程上执行shutdown hook。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

ShutdownHook原理

() { System.out.println("I'm shutdown hook..."); } }); 有了ShutdownHook我们可以 在进程结束时做一些善后工作,例如释放占用资源...是异步执行,但会等所有hook执行完毕才会退出。...,调用Shutdown.exit结束进程 这样覆盖了代码中主动结束进程和被kill杀死进程场景。...总结 综上,我们得出一些结论 重写捕获信号需要注意主动退出进程,否则进程可能永远不会退出,捕获信号执行是异步 用户级ShutdownHook是绑定在系统级ShutdownHook之上,且用户级是异步执行...,系统级是同步顺序执行,用户级处于系统级执行顺序第二位 ShutdownHook 覆盖面比较广,不论是手动调用接口退出进程,还是捕获信号退出进程,抑或是用户线程执行完毕退出,都会执行ShutdownHook

63041

java(JVM)结束时释放JNI资源(Runtime.addShutdownHook)

所以这个方案不可行,事实也是正是这样,执行shutdown.sh停止tomcat服务器时,执行top命令显示,java进程仍然在运行中,而且占用着大量内存。...也没有log “release JNI resoure…”输出,显示finalize()方法没有被执行。 所以如何在JVM结束时释放静态加载动态库中资源还是得另想办法。...下面是addShutdownHook方法原文说明(部分): Registers a new virtual-machine shutdown hook....当JVM结束时(正常结束,或被Ctrl-C中止,或因系统事件(logoff ,shutdown))会执行用addShutdownHook方法注册线程。...所以确保静态加载JNI资源释放办法,就是在加载动态库时候,向JVM注册一个hook线程,用于执行release()方法。

93720
  • 如何优雅地停止Java进程

    ,即:JVM,启动Java进程启动了一个JVM。...() System.out.println("do shutdown hook"); } }); 为JVM注册关闭钩子时机不固定,可以在启动Java进程之前,也可以在Java进程之后...使用关闭钩子注意事项 1.关闭钩子本质是一个线程(也称为Hook线程),对于一个JVM中注册多个关闭钩子它们将会并发执行,所以JVM并不保证它们执行顺序;由于是并发执行,那么很可能因为代码不当导致出现竞态条件或死锁等问题...2.Hook线程会延迟JVM关闭时间,这就要求在编写钩子过程中必须要尽可能减少Hook线程执行时间,避免hook线程中出现耗时计算、等待用户I/O等等操作。...Java进程(详见:Java程序优雅关闭两种方法),实际这是有问题

    6.3K31

    SpringCloud微服务如何优雅停机及源码分析

    方式一:kill -9 java进程id【不建议】 kill -9 属于强杀进程,首先微服务正在执行任务被强制中断了;其次,没有通过Eureka注册中心服务下线,Zuul网关作为Eureka Client...给JVM进程发送TERM终止信号时,会调用其注册 Shutdown Hook,当SpringBoot微服务启动时也注册了 Shutdown Hook 而直接调用/shutdown端点本质和使用 Shutdown...endpoints.shutdown.enabled = true endpoints.shutdown.sensitive = false 所有问题都导向了 Shutdown Hook执行什么??...注意: 由于在注销一步已经停掉了定时心跳线程,否则注销后下次心跳又会导致服务上线 总结 使用kill、kill -15 或 /shutdown端点都会调用Shutdown Hook,触发Eureka...端缓存刷新,使得服务不会再被调用,此时再通过/shutdown端点 或 暴利kill -9 停止服务进程,可以达到优雅下线效果 希望回滚,可以通过几种方式 还是/service-registry

    2K30

    研究优雅停机时一点思考

    在以前,我们发布 WEB 应用通常步骤是将代码打成 war 包,然后丢到一个配置好了应用容器( Tomcat,Weblogic) Linux 机器,这时候我们想要启动/关闭应用,方式很简单,运行其中启动...一个显而易见做法便是,根据应用名找到进程 id,杀死进程 id 即可达到关闭应用效果。 上述场景描述引出了我疑问:怎么优雅地杀死一个 springboot 应用进程呢?...收到了通知,紧接着执行了测试代码中 Shutdown Hook,最后执行了 DisposableBean#destory() 方法。...在容器初始化时,ApplicationContext 便已经注册了一个 Shutdown Hook,这个钩子调用了 Close() 方法,于是当我们执行 kill -15 pid 时,JVM 接收到关闭指令...最后再补充下整理这个问题时,自己对 jvm shutdown hook 一些理解。

    4.3K81

    哦,这就是java优雅停机?(实现及原理)

    将自己将要被销毁消息通知给子进程 各种资源释放 ......在 shutdown 之后会变成 SHUTDOWN 状态,无法接受新任务,随后等待正在执行任务执行完成。...shutdown() :启动顺序关闭,其中执行先前提交任务,但不接受新任务。如果已经关闭,则调用没有附加效果。此方法不等待先前提交任务完成执行。...shutdownNow():尝试停止所有正在执行任务,停止等待任务处理,并返回正在等待执行任务列表。当从此方法返回时,这些任务将从任务队列中耗尽(删除)。此方法不等待主动执行任务终止。...同时,也解释了一些应用执行 kill -15 pid 无法退出问题,:中断被阻塞了,或者hook运行了死循环代码。

    2K20

    Spring Boot程序正确停止姿势

    Spring Boot提供了2种优雅关闭进程方式: 基于管理端口关闭进程 基于系统服务方式关闭进程 基于管理端口关闭进程 基于管理端口方式实现进程关闭实际是模块spring-boot-actuator...=info, health, shutdown 完成上述准备工作以后,启动Spring Boot应用,通过调用POST http://localhost:8000/ops/shutdown即可关闭进程。...通过系统服务方式停止进程 Spring Boot支持直接将打包好执行jar包以系统服务方式运行,具体实现方式如下所述。 首先,将应用打包为完全可执行jar包。...如果启动服务失败,请检查对应名称服务文件是否放在正确位置(:systemd系统需要放在/etc/systemd/system目录下),或者检查启动服务用户权限,一些错误情形可以参考:https:/...logger.info("do something on shutdown hook"); } }); SpringApplication.run

    3.1K20

    SpringBoot 优雅停机正确姿势

    简单说,就是向应用进程发出停止指令之后,能保证正在执行业务操作不受影响,直到操作运行完毕之后再停止服务。...并且不再启动任务 3.当应用准备关闭时候,按需向外发出信号,告知其他应用服务准备接手,以保证服务高可用 如果暴力关闭应用程序,比如通过kill -9 命令强制直接关闭应用程序进程,可能会导致正在执行任务数据丢失或者错乱...那么如何在不影响正在执行业务情况下,将应用程序安全进行关闭呢?...二、方案实践 SpringBoot 官方文档,已经告诉开发者只需要实现特定接口即可监听到项目启动成功与关闭时事件,相关接口如下: CommandLineRunner接口:当应用启动成功后但在开始接受流量之前...,都会向 JVM 注册一个关闭钩子shutdown hook,以确保ApplicationContext在退出时候,通过这个勾子通知 JVM,实现服务正常关闭,以下介绍所有关闭服务方法,都是基于这一原理进行实现

    2.8K30

    如何优雅实现优雅停机?

    将自己将要被销毁消息通知给子进程 各种资源释放 ......ThreadPoolExecutor 在 shutdown 之后会变成 SHUTDOWN 状态,无法接受新任务,随后等待正在执行任务执行完成。...shutdown() :启动顺序关闭,其中执行先前提交任务,但不接受新任务。如果已经关闭,则调用没有附加效果。此方法不等待先前提交任务完成执行。...shutdownNow():尝试停止所有正在执行任务,停止等待任务处理,并返回正在等待执行任务列表。当从此方法返回时,这些任务将从任务队列中耗尽(删除)。此方法不等待主动执行任务终止。...同时,也解释了一些应用执行 kill -15 pid 无法退出问题,:中断被阻塞了,或者hook运行了死循环代码。

    2K10

    数栈技术分享:一文带你了解Flink jm、tm启动过程和资源分配

    Yarn RM接收到请求(和yarn交互不重点分析) 3)在被分配节点工作目录下启动launch_container.sh 4)在perJob模式下,最终调用是YarnJobClusterEntrypoint...启动上下文 11)TaskManager 进程加载并运行 YarnTaskExecutorRunner(Flink TaskManager入口类),初始化流程完成后启动 TaskExecutor(负责执行...handler:记录到日志 3)注册JVM关闭保障shutdown hook:避免JVM退出时被其他shutdown hook阻塞 4)打印YARN运行环境信息:用户名 5)从运行目录中加载flink...三、TM启动过程 输出各软件版本及运行环境信息、命令行参数项、classpath等信息 注册处理各种SIGNALhandler:记录到日志 注册JVM关闭保障shutdown hook:避免JVM...退出时被其他shutdown hook阻塞 加载flink配置文件、初始化文件系统、启动各种内部服务(RpcService、HAService、BlobServer、HeartbeatServices

    1.6K20

    数栈技术分享:一文带你了解Flink jm、tm启动过程和资源分配

    Yarn RM接收到请求(和yarn交互不重点分析) 3)在被分配节点工作目录下启动launch_container.sh 4)在perJob模式下,最终调用是YarnJobClusterEntrypoint...hook:避免JVM退出时被其他shutdown hook阻塞 4)打印YARN运行环境信息:用户名 5)从运行目录中加载flink conf 3、AM启动过程 1)创建并启动各类内部服务(包括...然后向YARN NM申请启动TaskManager进程,YARN NM启动Container流程与AM Container启动流程基本类似。...三、TM启动过程 输出各软件版本及运行环境信息、命令行参数项、classpath等信息 注册处理各种SIGNALhandler:记录到日志 注册JVM关闭保障shutdown hook:避免JVM...退出时被其他shutdown hook阻塞 加载flink配置文件、初始化文件系统、启动各种内部服务(RpcService、HAService、BlobServer、HeartbeatServices

    93110

    【转】Java中Runtime.exec一些事 

    0.4 Runtime.addShutdownHook()方法可以注册一个hook在JVM执行shutdown过程中,方法参数只要是一个初始化过但是没有执行Thread实例就可以。...Shutdown:当最后一个非精灵进程退出或者收到了一个用户中断信号、用户登出、系统shutdown、Runtimeexit方法被调用时JVM会启动shutdown过程,在这个过程开始后,他会并行启动所有登记...shutdown hook(注意是并行启动,这就需要线程安全和防止死锁)。...当shutdown过程启动后,只有通过调用halt方法才能中止shutdown过程并退出JVM。 Abort: abort退出时JVM就是停止运行但并不一定进行shutdown。...这只有JVM在遇到SIGKILL信号或者windows中止进程信号、本地方法发生类似于访问非法地址一类内部错误时会出现。这种情况下并不能保证shutdown hook是否被执行

    2.6K20

    K8S 滚动更新如何优雅停止 Pod

    优雅停止(Graceful shutdown) 这个说法来自于操作系统,我们执行关机之后都得 OS 先完成一些清理操作,而与之相对就是硬中止(Hard shutdown),比如拔电源。...到了分布式系统中,优雅停止就不仅仅是单机上进程自己事了,往往还要与系统中其它组件打交道。...简述滚动更新步骤 启动一个新 pod 等待新 pod 进入 Ready 状态 创建 Endpoint,将新 pod 纳入负载均衡 移除与老 pod 相关 Endpoint,并且将老 pod 状态设置为...,会执行 PreStop hookhook 可以执行一个 HTTP GET请求 或者 exec命令,并且它们执行是阻塞,可以利用这个特性来做优雅停止。... 会执行 PreStop hook,PreStop hook 执行完成后会向 pod 发送 SIGTERM 信号。

    5.8K10

    别乱用了,这才是 SpringBoot 停机正确方式!!!

    何为优雅关机 就是为确保应用关闭时,通知应用进程释放所占用资源 线程池,shutdown(不接受新任务等待处理完)还是shutdownNow(调用 Thread.interrupt进行中断) socket...,有时候也会出现无法关闭应用情况(线上理想情况下,是bug就该寻根溯源) #查看jvm进程pid jps #列出所有信号名称 kill -l   > 基于微服务思想,构建在 B2C 电商场景下项目实战...当然是在jvm启动时就加载了自定义SignalHandler,关闭jvm时触发对应handle。...registerShutdownInProgress) {//执行shutdown过程中不添加hook                 if (state > RUNNING)//如果已经在执行shutdown... else {//如果hooks已经执行完毕不能再添加hook

    76330

    Contour 中 Envoy 优雅停服实现与源码分析

    Envoy Daemonset 中会新增一个容器,这个容器执行这个新命令,暴露接口 当 preStop hook触发时,Envoy 容器和这个新容器会被更新 当 pod 收到一个关闭请求时,...boostrap 生成配置文件 /config/envoy.json 2: 主容器通过磁盘挂载共享 config 文件,并作为启动配置参数启动 envoy 进程 3:envoy 和服务端通过 XDS...不存在说明暂时还不能关闭,接口会阻塞在这里 4-2:和envoy一样(pod 中容器关闭是没有顺序,可以简单理解为并行执行),shutdown-manager 关闭前,会执行 preStop 钩子,执行...完成以上步骤,整个 pod 才可以退出 源码分析 从前面的设计文档得知,优雅停机主要跟 shutdown-manger这个进程有关,这里主要是分析 shutdown-manager 这个进程源码。...使用方式如下,该命令会在 shutdown-manager 进程被杀死之前 preStop 中被调用执行

    93730

    启动tomcat错误解决方案集

    一、Eclipse tomcat 启动超时: 错误内容: Server JBoss v4.0 at localhost was unable to start within 50 seconds..../WEB-INF/classes 4,再就是最重要要看工程下面是否缺少了work目录,由于CVS控制时不把work加版本,所以checkout后没有这个目录,要手工加上有的工程就能自动编译,最开始时候...端口被占用 解决方案一(推荐),修改tomcat/conf/server.xml文件 打开server.xml 将中8005改成不常用端口号即可,比如9876 解决方案二,将占用8005进程强行结束 (1) 在“运行”中输入CMD (2)在启动窗口中输入netstat -ano,就可以看到所有端口占用情况...,记下占用8005端口程序PID (3)打开“任务管理器”,点击菜单栏“查看”,再点击“选择列”,选上“PID(进程标识符)” 或者在cmd中输入tasklist命令,回车,查看 (4)在进程中找个相应

    99120

    关于tomcat一些启动错误解决方法

    作者:虚无境 链接: https://blog.csdn.net/qazwsxpcm/article/details/68946458 一、Eclipse tomcat 启动超时: 错误内容: Server.../WEB-INF/classes 4,再就是最重要要看工程下面是否缺少了work目录,由于CVS控制时不把work加版本,所以checkout后没有这个目录,要手工加上有的工程就能自动编译,最开始时候...端口被占用 解决方案一(推荐),修改tomcat/conf/server.xml文件 打开server.xml 将中8005...改成不常用端口号即可,比如9876 解决方案二,将占用8005进程强行结束 (1) 在“运行”中输入CMD (2)在启动窗口中输入netstat -ano,就可以看到所有端口占用情况,记下占用...8005端口程序PID (3)打开“任务管理器”,点击菜单栏“查看”,再点击“选择列”,选上“PID(进程标识符)” 或者在cmd中输入tasklist命令,回车,查看 (4)在进程中找个相应

    1.6K30

    RASP攻防 —— RASP安全应用与局限性浅析

    典型RSHUTDOWN方法: image (3) 下午7.56.55.png (4)Module shutdown 所有请求处理完毕后,SAPI也关闭了(即服务器关闭),PHP调用各个模块MSHUTDOWN...(1) 实现Hook Opcode 功能只需要改变 Hook Opcode 对应处理函数即可,而 zend 预先就提供了一个现成接口:zend_set_user_opcode_handler, :...mail() 、 error_log()、ImageMagick() 是常用于劫持触发函数,原因是在运行时候能够启动进程,这样才能重新加载我们所设置环境变量,从而劫持子进程所调用库函数。...以mail函数为例:mail函数在运行时,会启动进程来调用系统sendmail,sendmail引用了getegid() 函数。...无论 RASP 是hook opcode 还是 hook function,本质都没有从内存中删除所调用函数,只是改变了走向,指向了我们自定义函数。

    1.8K30

    shutdownHook 死锁解决

    最近碰到一个问题,通过脚本执行kill -15后,程序并没有退出,进程一直都在,最后被退出脚本通过kill -9,杀死。导致数据完整性被破坏,程序再重启后不可用。...registered"); hooks.put(hook, hook); } 添加后谁来处理shutdown这个操作,是 Shutdown.add 这里起了一个线程,处理所以主要逻辑在 runHooks...hooks = null; } } 这段代码中 hook.start(); 调用执行 hook方法,之后调用 hook.join释放执行权。...问题就出在 hook.join,程序执行到这里之后,卡住死锁,出不去了。...解决 即然已经知道原因了,那就好办: 移除 shutdownHook 中不必要加锁,shutdown 场景中很不需要用到加锁 使用不同加锁对象,如果一定需要加锁,可以在 shutdownHook

    18920
    领券