zoukankan      html  css  js  c++  java
  • 还有kill 9杀不掉的进程?kill命令详解

    我们很多人对kill -9 非常熟悉,在工作中也经常用到。特别是你去重启服务的时候。但是所有的服务都能用kill -9来处理吗?kill -9能杀掉所有的进程吗?

    首先我们来了解一下 kill -n 中的n到底是什么东西。

    kill

    17dd673367a7ec1189ed620056c7d574.png

    从help中可以清晰的看到 -n 指的是 信号编号,那问题来了,什么是“信号编号”?

    kill -l(查看Linux/Unix的信号变量)

    d7ad11e900dd0dd6d02fdf212b494e77.png

    下面先说一下SIGKILL(kill -9)和SIGTERM(kill -15)

    kill -9、kill -15

    kill -9 PID 是操作系统从内核级别强制杀死一个进程.

    kill -15 PID 可以理解为操作系统发送一个通知告诉应用主动关闭.

    SIGNTERM(15) 的效果是正常退出进程,退出前可以被阻塞或回调处理。并且它是Linux缺省的程序中断信号。

    大部分程序接收到SIGTERM信号后,会先释放自己的资源,然后再停止。但是也有程序可以在接受到信号量后,做一些其他的事情,并且这些事情是可以配置的。如果程序正在等待IO,可能就不会立马做出响应。也就是说,SIGTERM多半是会被阻塞的、忽略。

    但是kill -9 pid也不是所有的程序都会乖乖听话,总有那些状态下的程序无法立刻响应。

    kill -9杀不掉的怎么办

    用ps和grep命令寻找僵尸进

    ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'

    命令注解:

    • -A 参数列出所有进程

    • -o 自定义输出字段 我们设定显示字段为 stat(状态), ppid(进程父id), pid(进程id),cmd(命令)这四个参数 因为状态为 z或者Z的进程为僵尸进程。

    所以我们使用grep抓取stat状态为zZ进程,运行结果参考如下:

    Z 12334 12339 /path/cmd

    这时,我们可以使用 kill -HUP 12339来杀掉这个僵尸进程

    运行后,可以再次运行

    ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'

    来确认是否已经将僵尸进程杀死 如果kill 子进程无效,可以尝试kill 其父进程来解决问题,例如上面例子父进程pid是 12334,那么我们就运行

    kill -HUP 12334

    来解决问题

    一般可以用top命令发现动态进程表

    b2277c01e26b1e50e3cdb408123351bb.png

    其中zombie是僵尸进程

    附录:

    linux signals

    ee303cc7b8ff5256d17c8697596cabe9.png

    bd9027e937807393e98e513749ae4eef.png

    b534879577afed15d027839045c536b2.png

  • 相关阅读:
    Asp.Net Web API 2第八课——Web API 2中的属性路由
    Asp.Net Web API 2第七课——Web API异常处理
    Asp.Net Web API 2第六课——Web API路由和动作选择
    Asp.Net Web API 2第五课——Web API路由
    开始学习python
    BMI 小程序 购物车
    深浅copy 文件操作
    字典 dict 集合set
    基本数据类型 (str,int,bool,tuple,)
    python 运算符
  • 原文地址:https://www.cnblogs.com/lxwphp/p/15452448.html
Copyright © 2011-2022 走看看