范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

老板kill9的原理都不知道就敢去线上执行?明天不用来了

  相信很多程序员对于Linux系统都不陌生,即使自己的日常开发机器不是Linux,那么线上服务器也大部分都是的,所以,掌握常用的Linux命令也是程序员必备的技能。
  但是,怕就怕很多人对于部分命令只是一知半解,使用不当就能导致线上故障。
  前段时间,我们的线上应用报警,频繁FGC,需要紧急处理问题,于是有同事去线上重启机器(正常程序应该是先采集堆dump,然后再重启,方便排查是否存在内存泄露等问题)。
  但是在重启过程中,同事发现正常的重启命令应用无反应,然后尝试使用kill命令"杀"掉Java进程,但是仍然无效。于是他私自决定使用 "kill -9"结束了进程的生命。
  虽然应用进程被干掉了,但是随之而来带来了很多问题,首先是上游系统突然发生大量报警,对应开发找过来说调用我们的RPC服务无响应,频繁超时。
  后来,我们又发现系统中存在部分脏数据,有些在同一个事务中需要完整更新的数据,只跟新了一半...
  为什么正常的kill无法"杀掉"进程,而kill -9就可以?为什么kill -9会引发这一连串连锁反应?正常的kill执行时,JVM会如何处理的呢?
  要搞清楚这些问题,我们要先从kill命令说起。kill 命令
  我们都知道,想要在Linux中终止一个进程有两种方式,如果是前台进程可以使用Ctrl+C键进行终止;如果是后台进程,那么需要使用kill命令来终止。(其实Ctrl+C也是kill命令)
  kill命令的格式是:kill[参数][进程号]  如: kill 21121 kill -9 21121
  其中[参数]是可选的,进程号可以通过jps/ps/pidof/pstree/top等工具获取。
  kill的命令参数有以下几种:-l 信号,若果不加信号的编号参数,则使用"-l"参数会列出全部的信号名称
  -a 当处理当前进程时,不限制命令名和进程号的对应关系
  -p 指定kill 命令只打印相关进程的进程号,而不发送任何信号
  -s 指定发送信号
  -u 指定用户
  通常情况下,我们使用的-l(信号)的时候比较多,如我们前文提到的kill -9中的9就是信号。
  信号如果没有指定的话,默认会发出终止信号(15)。常用的信号如下:HUP 1 终端断线
  INT 2 中断(同 Ctrl + C)
  QUIT 3 退出(同 Ctrl + )
  TERM 15 终止
  KILL 9 强制终止
  CONT 18 继续(与STOP相反, fg/bg命令)
  STOP 19 暂停(同 Ctrl + Z)
  比较常用的就是强制终止信号:9和终止信号:15,另外,中断信号:2其实就是我们前文提到的Ctrl + C结束前台进程。
  那么,kill -9 和 kill -15到底有什么区别呢?该如何选择呢?kill -9 和 kill -15的区别
  kill命令默认的信号就是15,首先来说一下这个默认的kill -15信号。
  当使用kill -15时,系统会发送一个SIGTERM的信号给对应的程序。当程序接收到该信号后,具体要如何处理是自己可以决定的。
  这时候,应用程序可以选择:1、立即停止程序2、释放响应资源后停止程序3、忽略该信号,继续执行程序
  因为kill -15信号只是通知对应的进程要进行"安全、干净的退出",程序接到信号之后,退出前一般会进行一些"准备工作",如资源释放、临时文件清理等等,如果准备工作做完了,再进行程序的终止。
  但是,如果在"准备工作"进行过程中,遇到阻塞或者其他问题导致无法成功,那么应用程序可以选择忽略该终止信号。
  这也就是为什么我们有的时候使用kill命令是没办法"杀死"应用的原因,因为默认的kill信号是SIGTERM(15),而SIGTERM(15)的信号是可以被阻塞和忽略的。
  和kill -15相比,kill -9就相对强硬一点,系统会发出SIGKILL信号,他要求接收到该信号的程序应该立即结束运行,不能被阻塞或者忽略。
  所以,相比于kill -15命令,kill -9在执行时,应用程序是没有时间进行"准备工作"的,所以这通常会带来一些副作用,数据丢失或者终端无法恢复到正常状态等。Java是如何处理SIGTERM(15)的
  我们都知道,在Linux中,Java应用是作为一个独立进程运行的,Java程序的终止运行是基于JVM的关闭实现的,JVM关闭方式分为3种:正常关闭:当最后一个非守护线程结束或者调用了System.exit或者通过其他特定平台的方法关闭(接收到SIGINT(2)、SIGTERM(15)信号等)
  强制关闭:通过调用Runtime.halt方法或者是在操作系统中强制kill(接收到SIGKILL(9)信号)
  异常关闭:运行中遇到RuntimeException异常等。
  JVM进程在接收到kill -15信号通知的时候,是可以做一些清理动作的,比如删除临时文件等。
  当然,开发者也是可以自定义做一些额外的事情的,比如让tomcat容器停止,让dubbo服务下线等。
  而这种自定义JVM清理动作的方式,是通过JDK中提供的shutdown hook实现的。JDK提供了Java.Runtime.addShutdownHook(Thread hook)方法,可以注册一个JVM关闭的钩子。
  例子如下:package com.hollis;  public class ShutdownHookTest {      public static void main(String[] args) {         boolean flag = true;         Runtime.getRuntime().addShutdownHook(new Thread(() -> {             System.out.println("hook execute...");         }));          while (flag) {             // app is runing         }          System.out.println("main thread execute end...");     } }
  执行命令:➜ jps 6520 ShutdownHookTest 6521 Jps ➜ kill 6520
  控制台输出内容:hook execute... Process finished with exit code 143 (interrupted by signal 15: SIGTERM)
  可以看到,当我们使用kill(默认kill -15)关闭进程的时候,程序会先执行我注册的shutdownHook,然后再退出,并且会给出一个提示:interrupted by signal 15: SIGTERM
  如果我们执行命令kill -9:➜ kill -9 6520
  控制台输出内容:Process finished with exit code 137 (interrupted by signal 9: SIGKILL)
  可以看到,当我们使用kill -9 强制关闭进程的时候,程序并没有执行shutdownHook,而是直接退出了,并且会给出一个提示:interrupted by signal 9: SIGKILL总结
  kill命令用于终止Linux进程,默认情况下,如果不指定信号,kill 等价于kill -15。
  kill -15执行时,系统向对应的程序发送SIGTERM(15)信号,该信号是可以被执行、阻塞和忽略的,所以应用程序接收到信号后,可以做一些准备工作,再进行程序终止。
  有的时候,kill -15无法终止程序,因为他可能被忽略,这时候可以使用kill -9,系统会发出SIGKILL(9)信号,该信号不允许忽略和阻塞,所以应用程序会立即终止。
  这也会带来很多副作用,如数据丢失等,所以,在非必要时,不要使用kill -9命令,尤其是那些web应用、提供RPC服务、执行定时任务、包含长事务等应用中,因为kill -9 没给spring容器、tomcat服务器、dubbo服务、流程引擎、状态机等足够的时间进行收尾。
  最后,很多人会说,说了这么多,不是还得用 kill -9 吗?
  其实,本文的目的不是不让大家用,那就是因噎废食了。本文是希望大家可以了解其背后的原理,知道他可能带来的副作用。在选择要不要执行的时候,可以考虑到这些因素,如果能够针对可能发生的副作用,提前做好预案和心理准备,然后再执行,那就很完美了。
  在执行之后,发生了非预期的问题时,大家可以想到有可能和kill -9有关,那本文的目的也算达到了。
  作者:HollisChuang
  链接:https://juejin.im/post/5ebb5273e51d454dc87f2f60

全面取消,没买车的恭喜了!国家正式通知近日,全面取消二手车限迁政策话题冲上微博热搜,网友纷纷为此政策点赞图片,还有最新免征购置税车型发布,特斯拉Model3在列6月1日起,科目二考试执行新规等等每个政策与我们每个人都息因40万普票,税局突然找上门,补罚900万深圳某公司因取得40万虚开的普票被查了!补税罚款竟高达900多万!01hr因40万普票,税局突然找上门补罚900万近日,深圳市税务局第三稽查局发布的税务行政处罚事项告知书(深税三稽确定!每人补发300元!6月1日起开始执行炎炎夏日,高温津贴成了劳动者关注的热点问题!最新消息来了!6月1日起,广东高温津贴标准调高至每月300元!连发5个月!补贴翻倍!1hr现行高温补贴标准150元月调整至300元月!广小米10系列新机首次曝光!主打轻薄的5G手机今天,据内部人士消息爆料,小米很快会有一款新机发布,不是RedmiNote9系列,也不是小米CC10系列,而是小米10系列,惊不惊喜,意不意外?如果没猜错的话,这次的新机很可能是小大家都在传的iPhone12小刘海你知道是什么吗?有图有真相在刚过去的上周,关于iPhone12系列采用小刘海的消息越来越多,此外伴随而来的就是新机还将采用类似iPhone4的扁平化中框的设计。今天不说外观,只说iPhone12的小刘海。先魅族17售价曝光起售价卖3999元,17Pro价格4999元明天,魅族17系列就将正式发布了,当然,同样是在网上发布,大家又可以一起愉快的看直播了。这款手机的配置外观几乎不是什么秘密了,官方已经全部公布,只剩下大家最看重的价格没有公布了。大iQOO令人兴奋的新机下月发,配联发科高端芯片,支持5G双卡今天下午,联发科天玑1000正式登场,这对于目前比较平淡的5G移动平台来说,增填了一丝活力。据官方介绍,天玑1000最大的卖点就是业内唯一一款支持5G5G双卡双待搭载5G双载波聚合小米最便宜5G手机曝光,千元价位联发科芯片日前,有媒体报道了Redmi新机的相关消息,该新机很有可能会命名为RedmiNote10系列。要知道,现在Redmi机型承担了小米很大一部分出货量,从目前官方公布的信息看,NoteRedmi新机正式官宣,最便宜5G手机,没有之一还记得我们之前提到的RedmiK30i这款手机吗?现在它的官方消息来了,只不过换了个马甲,改名为RedmiK305G极速版。就在刚刚(5月8日上午10点),Redmi宣布将于5月1荣耀30Pro30Pro发布,买之前,这些问题你一定要知道今天(4月15日)下午,荣耀三款新机荣耀30荣耀30Pro荣耀30Pro正式发布,麒麟990矩阵四摄是本次发布会的重点,拍照无疑是重中之重,难怪现在很多网友都评论说所有手机发布会都实力还在,抢首发三星S10定档2月20日发布,售价约4600元起近日,不断有消息称三星在中国的市场份额进一步下降,甚至可以归纳到Other的范围内了,这不得不让人怀疑,高通下一代旗舰芯片骁龙855是不是还会给三星首发?在不久之前举办的骁龙技术峰
实拍测评飞利浦行车记录仪CVR1550行驶在路上,下一秒会发生什么我们无法预测可能前边精通醉拳的司机跟你耍起神龙摆尾也可能你会见证一名司机飘移梦破碎的瞬间亦或是见到让人心旷神怡的好风景行车记录仪正是在记录中展现其价值所好评如潮!飞利浦VTR8062线上线下供不应求上个月,飞利浦推出了一款全新智能指纹解锁录音笔VTR8062。从双十一首度上市至今,产品在各官方销售平台便收获诸多好评,除了线上销售火爆,包含线下渠道在内更是迎来供不应求的场面。一JetpackMVVM七宗罪之二使用luanchWhenX启动协程FlowvsLiveData自StateFlowSharedFlow出现后,官方开始推荐在MVVM中使用Flow替换LiveData。Flow基于协程实现,具有丰富的操作符,通过这Android开发面试requestLayout()这么问,面试者直呼太细了作者字节小站最近有个朋友跟我提了一个很有深度的问题。朋友锁屏后,调用View。requestLayout()方法后会不会postSyncBarrier?乍一看有点超纲了。细细一想,你的AndroidApp又需要适配了Android12,全新的App启动动画作者小虾米君早期的Android上App的启动速度常为人诟病,如今的启动表现已不逊iOS。Google针对系统的不断优化绝对功不可没,从8。0独立出来的SplashWindow,到Android研发大厂面试记阿里,字节,快手,滴滴等面试题汇总作者CDFcc7d最近花了大量的时间复习准备面试。杭州的一二线公司基本上都去面试过了,包括阿里,字节,快手,滴滴,有赞,涂鸦,哈啰(腾讯没有客户端的hc),其中也拿了几个不错的ofAndroid架构师你的业务代码,是不是都写在了Activity里?作者58沈剑互联网分层架构演进有两条核心原则(1)让上游更高效的获取与处理数据(复用)(2)让下游能屏蔽数据的获取细节(封装)数据从数据库缓存层,到微服务层,到站点应用层,最终都汇Android面试被锤记2021年新鲜出炉的Android面经作者贺利权终于做了这个决定别人怎么说我不理只要你也一样的肯定我愿意天涯海角都随你去我知道一切不容易我的心一直温习说服自己最怕你忽然说要放弃跳槽真的需要勇气来面对流言蜚语只要你一个OAndroidStudioArcticFox正式版发布,快来了解下吧AndroidStudio的新大版本又来了,大家快来躺坑。2020年12月份,google宣布了AndroidStudio4。2之后,将采用新的命名方式,首个更新后的版本为AndrAndroid高工细说Android多线程,探究原理知其所以然作者机智的张尼玛楔子苏格拉底曾说过学会了多线程,你就学会了压榨CPU,就好像资本家对无产阶级做的那事一样。多线程是开发人员必不可少的技术点,也是初学者不太容易掌握好的一个难点。要想FFmpeg引入AndroidStudioFFmpeg是什么?FFmpeg是一套开源免费跨平台的多媒体框架,它提供录制转换以及流化音视频的完整解决方案,在WindowsiOSAndroid提供了一个音视频处理的框架,FFm