• 还有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

  • 相关阅读:
    【面经】网易互娱一面
    【Go】简易到简陋的web服务器
    【Go】连接本地MySQL读取数据
    【MySQL】Windows10下安装
    【深入理解计算机系统】第十三章-并发编程
    【Python】数据库查询 & 批量下载文件
    【深入理解计算机系统】第十二章-网络编程
    grep的时候Binary file matches **.log 怎么解决
    高并发系统架构思想
    mysql 索引
  • 原文地址:https://www.cnblogs.com/lxwphp/p/15452448.html
Copyright © 2020-2023  润新知