1、Linux kill 命令用于删除执行中的程序或job。
语法:kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
kill [-s <信息名称或编号>][程序] 或 kill [-l <信息编号>]
参数说明:
- -l <信息编号> 若不加<信息编号>选项,则 -l 参数会列出全部的信息名称。
- -s <信息名称或编号> 指定要送出的信息。
- [程序] [程序]可以是程序的PID或是PGID,也可以是job编号。
使用 kill -l 命令列出所有可用信号。
最常用的信号是:
- 1 (HUP):重新加载进程。
- 9 (KILL):杀死一个进程,操作系统从内核级别强制杀死一个进程
- 15 (TERM):正常停止一个进程,操作系统发送一个通知告诉应用主动关闭。效果是正常退出进程,退出前可以被阻塞或回调处理。(默认)
2、进程kill关不掉
linux 的 kill 命令实际是向进程发送信号,并不是杀死的意思,-9 表示无条件退出,但由进程自行决定是否退出,这就是为什么 kill -9 终止不了系统进程和守护进程的原因。
通常有两种情况是不能kill掉的:
- 进程已经成为僵尸进程(Zombie),当它的父进程将它回收或将它的父进程kill掉即可在ps输出看不到了。("Zombie"进程要等到下次重启时才会消失,但它的存在不会影响系统性能。)
- 进程正处在内核状态(kernel mode),Linux进程运行时分内核和用户两种状态,当进程进入内核状态后,会屏蔽所有信号,包括SIGKIL,所以这个时候kill -9也变得无效了。
举例:
解决办法:
- 1、使用 ps -A -ostat,ppid,pid,cmd | grep pid命令,查看进程号以及父进程号,也可以进入到 /proc/1544目录下,执行cat status,查看父进程号
- 2、kill -9 父进程号 子进程号:
[root@bigdata3 ~]# kill -9 87186 87200
- 3、在kill前如果不放心,怕误杀,可以使用 ls -ail 查看PID被哪个应用程序占用。如图发现,被ocdp用户占用,可以切换命令,重复上述命令。
3、杀死指定用户所有进程(慎用)
#kill -9 $(ps -ef | grep ocdp) //方法一 过滤出ocdp用户进程 #kill -u ocdp//方法二