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

如何优雅地停止Java进程

目录 理解停止Java进程的本质 应该如何正确地停止Java进程 如何注册关闭钩子 使用关闭钩子的注意事项 信号量机制 总结 理解停止Java进程的本质 我们知道,Java程序的运行需要一个运行时环境...因此,所谓停止Java进程,本质上就是关闭JVM。 那么,哪些情况会导致JVM关闭呢? ? 应该如何正确地停止Java进程 通常来讲,停止一个进程只需要杀死进程即可。...不论如何,都应该在Java进程中注册关闭钩子,尽最大可能地保证在Java进程退出之前做一些善后的事情(实际上,大多数时候都需要这样做)。...3.关闭钩子执行过程中可能被强制打断,比如在操作系统关机时,操作系统会等待进程停止,等待超时,进程仍未停止,操作系统会强制的杀死该进程,在这类情况下,关闭钩子在执行过程中被强制中止。...实际上,大多数情况下的进程结束操作通常是在进程运行过程中需要停止进程或者重启进程,而不是等待进程自己运行结束(服务程序都是一直运行的,并不会主动结束)。

6.4K31

golang子进程的启动和停止,mac与linux的区别

简单调试后就找到了原因,在系统中启动的子进程,发出终止信号之后居然仍在运行,导致父进程也一直无法退出,尴尬了。...这段代码启动子进程和关闭子进程在mac电脑的原有系统上工作都很正常,但是到了linux,启动子进程仍然没有问题,关闭子进程不成功。...检查了一下在linux的工作过程,发现启动子进程之后,实际上是启动了两个进程,一个进程是/bin/sh,随后sh又启动了一个子进程自身的子进程sleep。...sh启动了另外一个子进程,这种方法就无效了(指在linux无效,mac测试是一样可以用的,关键区别同样是在mac,/bin/sh进程不会保留并等待我们启动的子进程退出,所以退出消息可以正常的发送到正常的子进程...所以为了跨平台的通用性,建议还是使用Process.Kill或者syscall.Kill来杀死子进程。

4.7K50
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    父进程退出时如何确保子进程退出?

    前言 子进程退出的时候,父进程能够收到子进程退出的信号,便于管理,但是有时候又需要在父进程退出的时候,子进程也退出,该怎么办呢? 父进程退出时,子进程会如何?...一般情况下,父进程退出后,是不会通知子进程的,这个时候子进程会成为孤儿进程,最终被init进程收养。我们先来看一下这种情况。...另外还可以观察到,该进程也是其他系统进程的父进程。 如何确保父进程退出的同时,子进程也退出? 既然如此,如何确保父进程退出的同时,子进程也退出呢?...内容很多,主要意思为:设置一个信号,当父进程退出的时候,子进程将会收到该信号。 那么根据这个,我们完全可以在父进程退出时,也给子进程一个退出的信号。...总结 有些情况下,我们常常需要父子进程共存亡,子进程退出时,父进程可以通过wait捕捉子进程的退出状态,但是父进程退出时,子进程却难以得知。

    12.4K21

    如何使用killall和kill命令来停止进程

    killall是一个基于名称终止系统上运行进程的工具。kill则是终止基于进程ID号(PID)的进程。kill和killall还可以向进程发送特定的系统信号。...用法 如何使用killall killall命令采用以下形式: killall [process name] killall将终止与指定名称匹配的所有程序。...您还可以使用以下格式之一指定信号: killall -KILL [process name] killall -SIGKILL [process name] killall -9 [process name] 如何使用...相反,一个信号被发送到进程,如果进程接收到一个给定的信号,进程将有相应的指令。...考虑下面的命令: killall -w irssi 这个示例将SIGTERM系统信号发送给一个后台进程,该进程的名称与irssi匹配。killall将等待匹配的进程结束。

    2.8K30

    supervisor 进程管理

    简介: Supervisor (http://supervisord.org) 是一个用 [Python] 写的进程管理工具,可以很方便的用来启动、重启、关闭进程(不仅仅是 Python 进程)。...px又产生了若干子进程, ;使用supervisorctl停止px进程,停止信号会传播给px产生的所有子进程,确保子进程也一起停止。...;这一配置项对希望停止所有进程的需求是非常有用的。...px又产生了若干子进程,使用supervisorctl停止px进程,停止信号会传播给px产生的所有子进程,确保子进程也一起停止。...这一配置项对希望停止所有进程的需求是非常有用的。 autostart=true 这一配置项的作用是:当启动supervisord的时候会将该配置项设置为true的所有进程自动启动。

    97320

    如何在Bash中等待多个子进程完成,并且当其中任何一个子进程以非零退出状态结束时,使主进程也返回一个非零的退出码?

    问题 如何在 Bash 脚本中等待该脚本启动的多个子进程完成,并且当这其中任意一个子进程以非零退出码结束时,让该脚本也返回一个非零的退出码? 简单的脚本: #!.../bin/bash for i in `seq 0 9`; do calculations $i & done wait 上述脚本将会等待所有 10 个被创建的子进程结束,但它总会给出退出状态 0...我应该如何修改这个脚本,使其能检测到被创建子进程的退出状态,并且当任何子进程以非零代码结束时,让脚本返回退出码 1?...# 存储上一个子进程启动的 pid echo " pid = ${pids[$i]}" done for pid in $pids; do wait $pid rc=$?...[ $rc -ne 0 ] && break # 若子进程以非零退出码结束,则跳出循环 done #echo $rc exit $rc 将代码保存为文件 wait_procs_demo.sh,再运行测试

    11600

    java检测tomcat宕机_Tomcat意外宕机分析

    这是一个有趣的现象,catalina.sh start方式启动的tomcat会把java进程挂到init(进程id为1)的父进程下,已经与当前test.sh进程脱离了父子关系,也与ssh进程没有关系,为什么关闭...因此这样的话,父进程会把收到的键盘事件比如ctrl-c之类的SIGINT传播给进程组中的每个成员(假设后台进程也是父进程组的成员),那么终端随意ctrl-c就可能导致所有的后台进程退出,显然这样是不合理的...传递给bash进程后,bash会把SIGHUP传递给它的子进程,并且对于其子进程test.sh,bash还会对test.sh的进程组里的成员都传播一遍SIGHUP。...因为java后台进程从父进程catalina.sh(又是从其父进程test.sh)继承的pgid,所以java进程仍属于test.sh进程组里的成员,收到SIGHUP后退出。...注: 如果把tail 打印的这一行去掉,为什么Java进程也不会退出,我猜原因应该是,如果没有tail的话, Java进程就不是他们的子进程了,自然怎么操作都不会受影响。

    1.4K10

    Tomcat进程意外退出,元凶居然是他...

    这说明shell对signal_handler做手脚是在执行用户逻辑之前,也就是脚本在fork出子进程的时候就设置了。...停止它,当然不能忽略SIGINT。...因为默认如果采用父进程的进程组ID,父进程会把收到的键盘事件比如ctrl-c之类的SIGINT传播给进程组中的每个成员,假设后台进程也是父进程组的成员,因为作业控制的需要不能忽略SIGINT,你在终端随意...把SIGHUP传递给bash进程后,bash会把SIGHUP传递给它的子进程,并且对于其子进程test.sh,bash还会对test.sh的进程组里的成员都传播一遍SIGHUP。...因为java后台进程从父进程catalina.sh(又是从其父进程test.sh)继承的pgid,所以java进程仍属于test.sh进程组里的成员,收到SIGHUP后退出。

    4.1K10

    Tomcat 进程意外突崩,元凶居然是它...

    这说明shell对signal_handler做手脚是在执行用户逻辑之前,也就是脚本在fork出子进程的时候就设置了。...停止它,当然不能忽略SIGINT。...因为默认如果采用父进程的进程组ID,父进程会把收到的键盘事件比如ctrl-c之类的SIGINT传播给进程组中的每个成员,假设后台进程也是父进程组的成员,因为作业控制的需要不能忽略SIGINT,你在终端随意...把SIGHUP传递给bash进程后,bash会把SIGHUP传递给它的子进程,并且对于其子进程test.sh,bash还会对test.sh的进程组里的成员都传播一遍SIGHUP。...因为java后台进程从父进程catalina.sh(又是从其父进程test.sh)继承的pgid,所以java进程仍属于test.sh进程组里的成员,收到SIGHUP后退出。

    1.1K10

    手摸手Go Context探秘

    基于简化目的,context包定义了Context类型,来传递超时、取消信号以及跨API边界和进程之间request-scope值。...() <-chan struct{} // 返回context取消的原因 Err() error // 返回context中指定的key关联的value,未指定返回nil // 主要用作在进程和...context交给父context管理,方便父节点取消时将取消事件传播给子context if p.children == nil { p.children = make(map[canceler...时如果未到截止时间且未取消 则会启动一个定时器,超时即会执行cancel操作 // timerCtx包含了一个定时器和一个截止时间 内嵌一个cancelCtx来实现 Done和Err方法 // 取消操作通过停止定时器然后调用...valueCtx struct { Context key, val interface{} } 总结 context包核心实现除去注释只有200-300行,整体实现还是短小精悍,为我们提供了跨进程

    18720

    大数据开发:Redis分布式主从复制

    在从节点执行 slaveof 命令后,复制过程便开始运作,下面图示大概可以看到 图片2.png 四.如何使用主从复制 在Redis中,可以通过SLAVEOF命令或者设置slaveof选项,可以让一个服务器去复制另一个服务器...2.命令传播:将作用于主服务器的写命令,传播给从服务器进行执行,从而保证主从数据库状态一致。...master 启动一个后台进程将数据库快照保存到 RDB 文件中 注意:此时如果生成 RDB 文件过程中存在写数据操作会导致 RDB 文件和当前主 redis 数据不一致,所以此时 master 主进程会开始收集写命令并缓存起来...如果 master 同时收到多个 slave 发来的同步连接命令,只会启动一个进程来写数据库镜像,然后发送给所有 slave。...在 redis2.8 之前从 redis 每次同步都会从主 redis 中复制全部的数据,如果从 redis 是新创建的从主 redis 中复制全部的数据这是没有问题的,但是,如果当从 redis 停止运行

    57710

    自动化测试之进程管理

    那supervisor是如何实现进程管理并重启的呢? supervisor管理进程就是通过fork/exec的方式把这些被管理的进程,当作supervisor的子进程来启动。...被管理进程作为supervisor的子进程,当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息,所以当然也就可以对挂掉的子进程进行自动重启操作,当然重启还是不重启,还要看你的配置文件里面有没有设置autostart...2、精准 使用supervisor监控子进程,得到的子进程状态无疑是准确的。...而在linux系统上是没有这种功能的,我们想要停止一个进程,只能一个一个的去停止,要么就自己写个脚本去批量停止。...Supervisord:负责管理进程的server,它会根据配置文件创建指定数量的应用程序的子进程,管理子进程的整个生命周期,对挂掉的进程重启,对进程变化发送事件通知等。

    33920
    领券