一. 终止进程的工具kill 、killall、pkill、xkill
 
终止一个进程或终止一个正在运行的程序,一般是通过kill 、killall、pkill、xkill 等进行。比如一个程序已经死掉,但又不能退出,这时就应该考虑应用这些工具。
另外应用的场合就是在服务器管理中,在不涉及数据库服务器程序的父进程的停止运行,也可以用这些工具来终止。为什么数据库服务器的父进程不能用这些工具杀死呢?原因很简单,这些工具在强行终止数据库服务器时,会让数据库产生更多的文件碎片,当碎片达到一定程度的时候,数据库就有崩溃的危险。比如mysql 服务器最好是按其正常的程序关闭,而不是用pkill mysqld 或killall mysqld 这样危险的动作;当然对于占用资源过多的数据库子进程,我们应该用kill 来杀掉。
 
1. kill
kill的应用是和ps 或pgrep 命令结合在一起使用的;
kill 的用法:

kill [信号代码] 进程ID

注:信号代码可以省略;我们常用的信号代码是-9 ,表示强制终止;
举例:

[root@localhost ~]# ps auxf |grep httpd

root  0.0 0.0   pts/ S+ : : \_ grep httpd

root  0.1 1.3   ? Ss : : /usr/sbin/httpd

apache  0.0 0.6   ? S : : \_ /usr/sbin/httpd

apache  0.0 0.6   ? S : : \_ /usr/sbin/httpd

apache  0.0 0.6   ? S : : \_ /usr/sbin/httpd

apache  0.0 0.6   ? S : : \_ /usr/sbin/httpd

apache  0.0 0.6   ? S : : \_ /usr/sbin/httpd

我们查看httpd 服务器的进程;您也可以用pgrep -l httpd 来查看;
我们看上面例子中的第二列,就是进程PID的列,其中4830是httpd服务器的父进程,从4833-4840的进程都是它4830的子进程;如果我们杀掉父进程4830的话,其下的子进程也会跟着死掉;

[root@localhost ~]# kill  注:杀掉4840这个进程;

[root@localhost ~]# ps -auxf |grep httpd 注:查看一下会有什么结果?是不是httpd服务器仍在运行?

[root@localhost ~]# kill  注:杀掉httpd的父进程;

[root@localhost ~]# ps -aux |grep httpd 注:查看httpd的其它子进程是否存在,httpd服务器是否仍在运行?

对于僵尸进程,可以用kill -9 来强制终止退出;
比如一个程序已经彻底死掉,如果kill 不加信号强度是没有办法退出,最好的办法就是加信号强度-9 ,后面要接杀父进程;比如;

[root@localhost ~]# ps aux |grep gaim

beinan  9.0 2.3   ? S : : gaim

root  0.0 0.0   pts/ S+ : : grep gaim

或[root@localhost ~]# pgrep -l gaim

 gaim

[root@localhost ~]# kill - 

2. killall
killall 通过程序的名字,直接杀死所有进程,咱们简单说一下就行了。

用法:killall 正在运行的程序名

killall 也和ps或pgrep 结合使用,比较方便;通过ps或pgrep 来查看哪些程序在运行;
举例:

[root@localhost beinan]# pgrep -l gaim

 gaim

[root@localhost beinan]# killall gaim

3. pkill
 
pkill 和killall 应用方法差不多,也是直接杀死运行中的程序;如果您想杀掉单个进程,请用kill 来杀掉。

应用方法:pkill 正在运行的程序名

举例:

[root@localhost beinan]# pgrep -l gaim

 gaim

[root@localhost beinan]# pkill gaim

4. xkill
 
xkill 是在桌面用的杀死图形界面的程序。比如当firefox 出现崩溃不能退出时,点鼠标就能杀死firefox 。当xkill运行时出来和个人脑骨的图标,哪个图形程序崩溃一点就OK了。如果您想终止xkill ,就按右键取消;

xkill 调用方法:

[root@localhost ~]# xkill

二.Linux的kill命令与信号控制
 
信号是用来与守护程序和进程通信的。任何活动任务都是一个进程,而守护程序是等待对某些事件做出反应或者按照日程安排执行任务的后台服务。一个程序必须有建在其中的信号处理程序用于捕获和应答信号。在LINUX中的signal 参考指南解释了各种不同信号和这些信号的用途。信号是由“kill”命令发出的。kill -l命令可以显示一个可用信号列表及其编号。
 
所有的守护程序和进程都有一个进程ID(PID),例如使用ps命名所显示的内容:

$ ps aux

USER PID %CPU %MEM TTY STAT COMMAND

root  0.0 0.1 ? S init []

  0.0 0.2 ? Ss /usr/bin/dbus-daemon --system

hal  0.0 0.7 ? Ss /usr/sbin/hald

postfix  0.0 0.2 ? S qmgr -l -t fifo -u -c

nagios  0.0 0.2 ? SNs /usr/sbin/nagios /etc/nagios/nagios.cfg

这个输出是经过简化的。你在系统中可以看到更多的行和栏目。如果某些进程消耗了你的全部CPU或者内存,你可以在这个输出的%CPU和%MEM列中发现它们。找到失控的进程的一种更快捷的方法是使用top命令,因为按照默认的设置,使用占用CPU资源最多的进程在最上面显示。我们可以使用一条“yes”命令来测试一下:

yes carla is teh awesum

这个命令将以很高的速度反复显示“carla is teh awesum”,直到你停止它运行。这将使你的CPU使用率达到警戒线。

$ top
...

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

12144 carla 25 0 31592 17m 13m R 93.4 3.5 0:50.26 konsole

22236 carla 15 0 2860 468 400 S 4.3 0.1 0:00.97 yes

分析一下这个结果,你会发现一些有趣的事,你会发现,占用CPU最多的程序是konsole虚拟终端程序,而不是“yes”命令,这是因为“yes”命令是在konsole终端程序中运行的。如果在一个“真正的”控制台(按Ctrl+alt+f2键)中运行同样的命令序列,你将看到“yes”命令被排在第一位。
 
有许多停止“yes”命令运行的方式。如果你要回到运行它的shell中,按CTRL+c键就可以了。或者你可以在另一个shell中用“kill”命令停止“yes”命令的运行,Kill命令后面跟PID或者命令名称,如下如示:

$ kill
或者
$ killall yes

按CTRL+c键发出一个SIGINT(信号2),这个信号是键盘要求取得控制权的中断信号。kill和killall这两个命令按照默认的设置都发出一个SIGTERM信号(编号15)。程序中可以设置对SIGTERM信号(15)是捕捉或者忽略,或者以不同的方式解释。因此,如果你的程序对于KILL 命令的反应与你预期不同,很可能是被KILL的目标程序的问题。
 
终止一个父进程通常也终止了它的子进程。不过,情况并不总是如此。你知道子进程是什么吗?使用ps命令加上-f选项就可以看到,如下所示:

$ ps axf

 ? R : _ konsole [kdeinit]

 pts/ Ss : | _ /bin/bash

 pts/ S+ : | | _ yes carla is teh awesum

 pts/ Rs : | _ /bin/bash

 pts/ R+ : | | _ ps axf

现在,回到SIGHUP的话题
 
SIGHUP的发音是“sig-hup”,是signal hangup的缩写,含义是“中止信号”。你如何发送一个SIGHUP信号呢?这里有几种方式:

# kill -HUP [pid]

# killall -HUP [process-name]

# kill - [pid]

# killall - [process-name] 

因此,你可以使用PID或者名称,信号名称或者号码。那么为什么要这样做而不使用/etc/init.d/foo命令重新启动呢?使用它们自己的init(初始化)文件来控制服务是优先选择的方式,因为这些文件通常包含健全和错误检查以及额外的功能。使用“kill”命令和信号的主要原因是尽可能明确地终止挂起和失控的进程,而不必重新启动或者登出。
 
终止进程
 
正如你在关于信号的man page中所看到的,有十几种控制进程的方法。下面是一些常用的方法:

kill -STOP [pid]

发送SIGSTOP (17,19,23)停止一个进程,而并不消灭这个进程。

kill -CONT [pid]

发送SIGCONT (19,18,25)重新开始一个停止的进程。

kill -KILL [pid]

发送SIGKILL (9)强迫进程立即停止,并且不实施清理操作。

kill - -

终止你拥有的全部进程。
 
SIGKILL和SIGSTOP信号不能被捕捉、封锁或者忽略,但是,其它的信号可以。所以这是你的终极武器。
Bash shell的Kil命令l
Bash外壳包含一个内置的kill命令,当执行下面命令:

$ type -all kill

kill is a shell built-in

kill is /bin/kill

命令的结果表明有两个kill命令,一个是BASH的内置命令,另一个是/bin/kill可执行程序。一般来说这两个命令不太可能遇到冲突的情况,不过,如果你确实遇到了kill命令行为异常时,你可以明确的指定/bin/kill命令。

参考:https://www.2cto.com/os/201202/118483.html

kill详解的更多相关文章

  1. sigqueue与kill详解及实例

    /*********************************************************************************************** 相关函 ...

  2. Ubuntu kill命令用法详解

    转自:Ubuntu kill命令用法详解 1. kill   作用:根据进程号杀死进程   用法: kill [信号代码] 进程ID   root@fcola:/# ps -ef | grep sen ...

  3. kill 命令详解 系统信号

    kill  命令详解  系统信号 参考: 了解Linux的进程与线程 http://www.cnblogs.com/MYSQLZOUQI/p/4234005.html Linux就这个范儿 P532 ...

  4. orakill和ALTER SYSTEM KILL SESSION详解

    --orakill和ALTER SYSTEM KILL SESSION详解[转]-----------------------------------------2013/11/05 一个用户进程偶尔 ...

  5. killall 、kill 、pkill 命令详解 【转】

    之前常用地kill 命令就是 kill -9 XXid;kill -15 XXid;pkill 进程名: 今天发现killall也有适用场景,killall命令对杀死进程组(一个进程中有多线程的情况) ...

  6. ngx_lua_API 指令详解(六)ngx.thread.spawn、ngx.thread.wait、ngx.thread.kill介绍

    摘要:通过lua-nginx-module中的ngx.thread同时执行多个任务. ngx_lua中访问多个第三方服务 ngx_lua中提供了ngx.socket API,可以方便的访问第三方网络服 ...

  7. kill命令详解

    基础命令学习目录首页 原文链接:https://www.cnblogs.com/wangcp-2014/p/5146343.html 1.命令格式: kill[参数][进程号] 2.命令功能: 发送指 ...

  8. ps -ef|grep详解 、kill与kill -9的区别

    ps -ef|grep详解 ps命令将某个进程显示出来 grep命令是查找 中间的|是管道命令 是指ps命令与grep同时执行 PS是LINUX下最常用的也是非常强大的进程查看命令 grep命令是查找 ...

  9. [转]keil使用详解

    第一节 系统概述 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上.结构性.可读性.可维护性上有明显的优势,因而易学易用.用过 ...

随机推荐

  1. Python - Django - 自定义一个中间件

    中间件简介: 中间件是在 wsgi.py 之后,urls.py 之前,在全局操作 Django 请求和响应的模块 在 settings.py 中可以看到中间件的相关配置 该列表中的每一个元素都是一个类 ...

  2. Promise.resolve解析

    总结自:https://blog.csdn.net/lq15310444798/article/details/81275278 Promise.resolve返回一个Promise实例 参数分4种情 ...

  3. c++动态链接问题

    https://blog.csdn.net/liu0808/article/details/81169173 https://blog.csdn.net/f110300641/article/deta ...

  4. 说说Java Web中的Web应用程序|乐字节

    大家好,我是乐字节的小乐,今天接着上期文章<Javaweb的概念与C/S.B/S体系结构>继续往下介绍Java Web ,这次要说的是web应用程序. 1. Web 应用程序的工作原理 W ...

  5. 处理登录时,AJAX的状态码无权限情况

    $.ajaxSetup({ complete: function(XMLHttpRequest, textStatus) { }, error:function(jqXHR,textStatus,er ...

  6. 028 SSM综合练习04--数据后台管理系统--订单相关操作

    1.订单表及其关联表的关系分析 2.数据库表对应实体类 (1)Orders.java package lucky.domain; import lucky.utils.DateUtils; impor ...

  7. IUrlHelper ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index

    ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of ...

  8. 一秒可生成500万ID的分布式自增ID算法—雪花算法 (Snowflake,Delphi 版)

    概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有些时候我们希望能使用一种 ...

  9. C语言指针的一些用法

    指针是C语言的灵魂,精华之所在.指针强大而危险,用得好是一大利器,用得不好是一大潜在危害.正是指针具有强大而又危险的特性,加上指针比较难,很多人用的不好,所以越是封装程度高的语言,越是没有指针的&qu ...

  10. redis源码分析(六)--cluster集群同步

    Redis集群消息 作为支持集群模式的缓存系统,Redis集群中的各个节点需要定期地进行通信,以维持各个节点关于其它节点信息的实时性与一致性.如前一篇文章介绍的,Redis在专用的端口监听集群其它节点 ...