Linux kill & Java shutdownhook

shutdown-hook

  • 建议加上shutdown的钩子
    • 如果程序出现了内存溢出crash 则现在代码是没有任何保护措施的
    • 或者说运维不小心关闭了服务器等
    • 或者运维不小心kill了游戏服务器进程等
  • 无法避免kill -9
  • 时机
    • 程序正常退出
    • 使用System.exit()
    • 终端使用Ctrl+C触发的中断
      + 系统关闭
    • OutOfMemory宕机
    • 使用Kill pid命令干掉进程(注:在使用kill -9 pid时,是不会被调用的)

kill

  • kill默认信号是SIGTERM
    • 15 终止信号
  • kill -9
    • SIGKILL kill信号
  • kill -2
    • SIGINT interrupt 中断信号
    • 同ctrl-c
  • kill -1
    • SIGHUP hang up 挂起信号
  • kill -3
    • SIGQUIT 可打印进程#线程堆栈
  • 只有kill -9能够结束jvm进程,别的信号量只是发送给java进程处理,至于如何响应是程序代码决定的
    • SIGTERM是不带参数时kill发送的信号,意思是进程终止运行,但执行与否还得看进程是否支持.如果进程还没有终止,可以使用 kill -SIGKILL pid,这是由内核来终止进程,进程不能监听这个信号
    • Java程序如果添加了shutdownhook,则可以监听1/2/15

linux

  • screen
  • SIGHUP与nohup
    • 当用户启动一个进程的时候,这个进程是运行在前台,使用与相应控制终端相联系的标准输入、输出进行输入和输出。即使将进程的输入输出重定向,并将进程放在后台执行,进程仍然和当前终端设备有关系。正因为如此,在当前的登录会话结束时,控制终端设备将和登录进程相脱离,那么系统就向所有与这个终端相联系的进程发送SIGHUP的信号,通知进程线路已经挂起了,如果程序没有接管这个信号的处理,那么缺省的反应是进程结束。因此普通的程序并不能真正脱离登录会话而运行进程,为了使得在系统登录后还可以正常执行,只有使用命令nohup来启动相应程序

测试kill与Java#shutdownhook与nohup

  • 主要测试比较不常见的kill#-1,#-2,#-3选项
  • 测试代码
public class ShutdownHookTest {
    public static void main(String[] args) throws Exception {
        Runtime.getRuntime()
                .addShutdownHook(new Thread(() -> System.out.println("ShutdownHookTest")));

        while (true) {
            Thread.sleep(5000);
        }
    }
}
  • 测试步骤
    • $ javac javac ShutdownHookTest.java // 编译,生成.class
    • $ java ShutdownHookTest // 前台运行
    • $ jps // 切换到另一个session,查询进程pid
    • $ kill -1 1729 // 使用kill -1 发出HUP的信号
      • 进程结束
      • 控制台输出:ShutdownHookTest 即钩子可监听SIGHUP(1)
      • 解释:因为进程本身就是非nohup运行 则HUP信号直接结束该进程(可参考nohup命令)
        • 如果用nohup启动(会忽略SIGHUP信号) 则kill -1则无效 即进程没有结束
        • 因为进程没结束 所以也不会执行shutdownhook
    • $ kill -2 1729 // 使用kill -2 发出INTTERUPT中断信号
      • 控制台输出:ShutdownHookTest 即钩子可监听SIGINT(2)
      • 进程退出的原因是发送了一个中断信号,而我们的Java程序核心逻辑是sleep,sleep被中断,进程结束
        • 只能中断前台进程
        • 如果我们是用nohup & 启动,即后台进程则无法中断
        • nohup表示忽略SIGHUP &表示后台进程
    • $ kill -3 1729 // 使用kill -3 发出SIGQUIT信号
      • 直接打印出了进程#线程堆栈
          2017-09-01 15:38:29
          Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.40-b25 mixed mode):
          ...
      
      • 即该命令可以直接打印进程的线程堆栈信息(又多了一个技能包) 前台进程也没有结束
      • 如果是用nohup启动的 则默认会将线程堆栈信息写入nohup.out
        • 如果你将nohup日志重定向到了/dev/null 则无法看到输出
    • $ kill -15 1729 // 使用kill -15 发出SIGTERM信号 终止信号(15是kill的默认信号)
      • 控制台输出:ShutdownHookTest 即钩子可监听SIGTERM
      • 进程退出 原因同 -2
      • 前台进程和后台进程都可终止
    • $ kill -9 1729 // 使用kill -9 发出SIGKILL信号 kill信号
      • 控制台直接显示Killed字样 shutdownhook的输出没有执行
      • 进程退出
      • 即钩子无法监听9
  • 其他
    • 只有kill -9能够结束jvm进程,别的信号量只是发送给java进程处理,至于如何响应是程序代码决定的
    • kill -3 可以打印线程堆栈
    • kill -1 对于nohup启动的进程无法终止,因为nohup忽略该信号
    • kill -2 中断前台进程
    • kill -15 前后台进程都可以终止
    • kill -9 死亡kill
    • shell中使用& 可避免终端关闭因SIGHUP信号而终止
      • 非nohup & 可使用kill -1 或者kill -15 或者kill终止
      • 不能使用kill -2终止,因为&表示后台进程 无法关闭
    • 即kill -1/-2/-15 SIGHUP/SIGINT/SIGTERM 都可以将进程关闭
    • 而Java的shutdownhook也恰恰可以监听1/2/15
    • 归根结底,关服最稳妥的方法就是,用http触发关服方法,同时在钩子里也触发这个方法,业务中关服了开服需要继续的,业务单独实现入库
  • 其他测试
    • 如果我们的程序的主逻辑是一个等待标准输入的逻辑
      • 1/2/15都可以终止程序
      • ctrl+c也可以终止
      • 如果直接用nohup启动的话则会直接抛出异常
        • If standard input is associated with a terminal, the nohup utility may redirect standard input from an unspecified file.
        • standard input get redirected from /dev/null by nohup
        • 关闭标准输入 该进程不再能够接收任何输入,即使运行在前台
        • nohup命令安排来自/dev/null的输入,并且输出和错误都可以转到nohup.out
      • 当前与终端交互的进程称为前台进程组,其余进程组称为后台进程组
      • 相对而言nohup占用资源更少,没有交互需求的时候,nohup就能满足需要了
        • !! 如果需要交互逻辑需要用screen/tmux
    • jvm有一个-Xrs的参数(reduce signal),用来忽略系统信号
  • ref
  • 扩展-why nohup redirect stanard input
    Historical versions of nohup did not affect standard input, but that causes problems in the common scenario where the user logs into a system, types the command:
    
    nohup make &
    
    at the prompt, and then logs out. If standard input is not affected by nohup, the login session may not terminate for quite some time, since standard input remains open until make exits. To avoid this problem, POSIX.1-2008 allows implementations to redirect standard input if it is a terminal. Since the behavior is implementation-defined, portable applications that may run into the problem should redirect standard input themselves. For example, instead of:
    
    nohup make &
    
    an application can invoke:
    
    nohup make </dev/null &
The redirection of stdin for nohup is entirely optional as nohup will usually redirect it to </dev/null if it was a terminal, to avoid the terminal not being able to close when you type exit. You can do your own 0< redirection, to /dev/null or a file, to avoid this.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容