Linux终止进程的工具kill/killall/pkill/xkill/skill用法区别(转)

Linux终止进程的工具kill/killall/pkill/xkill/skill用法区别(转)

大家好,又见面了,我是全栈君。

一. 终止进程的工具kill 、killall、pkill、xkill

终止一个进程或终止一个正在运行的程序,一般是通过kill 、killall、pkill、xkill等进行。比如一个程序已经死掉,但又不能退出,这时就应该考虑应用这些工具。

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

1、kill

kill的应用是和ps或pgrep命令结合在一起使用的;

kill的用法:

kill [信号代码] 进程ID

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

举例:

ps auxf |grep httpd

root 4939 0.0 0.0 5160 708 pts/3 S+ 13:10 0:00 \_ grep httpd

root 4830 0.1 1.3 24232 10272 ? Ss 13:02 0:00 /usr/sbin/httpd

apache 4833 0.0 0.6 24364 4932 ? S 13:02 0:00 \_ /usr/sbin/httpd

apache 4834 0.0 0.6 24364 4928 ? S 13:02 0:00 \_ /usr/sbin/httpd

apache 4835 0.0 0.6 24364 4928 ? S 13:02 0:00 \_ /usr/sbin/httpd

apache 4836 0.0 0.6 24364 4928 ? S 13:02 0:00 \_ /usr/sbin/httpd

apache 4840 0.0 0.6 24364 4928 ? S 13:02 0:00 \_ /usr/sbin/httpd

查看httpd服务器的进程;也可以用pgrep -l httpd来查看;

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

kill 4840 

注:杀掉4840这个进程;

ps -auxf |grep httpd

注:查看一下会有什么结果?是不是httpd服务器仍在运行?

kill 4830 

注:杀掉httpd的父进程;

ps -aux |grep httpd

注:查看httpd的其它子进程是否存在,httpd服务器是否仍在运行?

对于僵尸进程,可以用kill -9来强制终止退出;

比如一个程序已经彻底死掉,如果kill不加信号强度是没有办法退出,最好的办法就是加信号强度-9 ,后面要接杀父进程;比如:

ps aux |grep gaim

beinan 5031 9.0 2.3 104996 17484 ? S 13:23 0:01 gaim

root 5036 0.0 0.0 5160 724 pts/3 S+ 13:24 0:00 grep gaim

pgrep -l gaim

5031 gaim

kill -9 5031

2、killall

killall通过程序的名字,直接杀死所有进程。

用法:

killall 正在运行的程序名

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

举例:

pgrep -l gaim

2979 gaim

killall gaim

3、pkill

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

用法:

pkill 正在运行的程序名

举例:

pgrep -l gaim

2979 gaim

pkill gaim

4、xkill

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

用法:

xkill

二、Linux的kill命令与信号控制

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

所有的守护程序和进程都有一个进程ID(PID),例如使用ps命名所显示的内容:

ps aux

USER PID %CPU %MEM TTY STAT COMMAND

root 1 0.0 0.1 ? S init [2]

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

hal 7796 0.0 0.7 ? Ss /usr/sbin/hald

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

nagios 8371 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 22236

或者

killall yes

按CTRL+C键发出一个SIGINT(信号2),这个信号是键盘要求取得控制权的中断信号。kill和killall这两个命令按照默认的设置都发出一个SIGTERM信号(编号15)。程序中可以设置对SIGTERM信号(15)是捕捉或者忽略,或者以不同的方式解释。因此,如果程序对于KILL命令的反应与预期不同,很可能是被KILL的目标程序的问题。

终止一个父进程通常也终止了它的子进程。不过,情况并不总是如此。知道子进程是什么吗?使用ps命令加上-f选项就可以看到,如下所示:

ps axf

22371 ? R 2:35 _ konsole [kdeinit]

22372 pts/3 Ss 0:00 | _ /bin/bash

24322 pts/3 S+ 0:00 | | _ yes carla is teh awesum

22381 pts/4 Rs 0:00 | _ /bin/bash

24323 pts/4 R+ 0:00 | | _ ps axf

现在,回到SIGHUP的话题:

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

kill -HUP [pid]
killall -HUP [process-name]
kill -1 [pid]
killall -1 [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 -9 -1

终止拥有的全部进程。

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命令。

参考资源

  • Linux Cookbook一书的第七章“开始和终止Linux”
  • bash (1) – GNU Bourne-Again Shell
  • yes (1) – 在被终止前反复打印字符
  • signal (7) – 可用信号列表
  • ps (1) – 报告当前进程的快照
  • kill (1) – 向一个进程发出信号
  • killall (1) – 按名字消灭进程
  • pkill (1) – 根据名字和其它属性查看或者发出进程信号
  • skill (1) – 发送一个信号或者报告进程状态
  • xkill (1) – 按照X资源消灭一个客户程序

 

转自:http://bbs.chinaunix.net/thread-1810140-1-1.html

==>如有问题,请联系我:easonjim#163.com,或者下方发表评论。<==

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108337.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Pycharm使用技巧——自动调整代码格式汇总!自动化神器!

    Pycharm使用技巧——自动调整代码格式汇总!自动化神器!代码自动填充了空格问题在使用pycharm的代码编辑器时,常常懒得写空格,如下图,但这是不符合代码规范的,而且也会影响可读性。解决方法pycharm有自动调整代码格式的快捷键,默认为Alt+Ctrl+L,按下快捷键后,代码自动填充了空格。自动对齐代码问题在使用pycharm的代码编辑器时,有点时候copy的代码的没有按照代码格式对齐,如下图,但这是不符合代码规范的,而且也会影响可读性。解决方法pycharm有自动调整代码格式的快捷键,默认为Alt+Ctrl+L

    2022年8月27日
    26
  • activiti工作流开发_flowable工作流

    activiti工作流开发_flowable工作流深入理解Activiti工作流Activiti作为一个流行的开源工作流引擎,正在不断发展,其6.0版本以API形式提供服务,而之前版本基本都是要求我们的应用以JDK方式与其交互,只能将其携带到我们的应用中,而API方式则可以服务器独立运行方式,能够形成一个专网内工作流引擎资源共享的方式。Activiti执行的BPMN2.0,这个规范中有几个要素见下图:其实最经常使用的是开始结束事件和任务,本文就以…

    2022年10月6日
    6
  • 开源阅读书源_阅读3.20.0518追书神器 海量书源 免费开源无广告[通俗易懂]

    开源阅读书源_阅读3.20.0518追书神器 海量书源 免费开源无广告[通俗易懂]特别声明所有软件皆来源于网上收集整理,仅供学习与交流技术,不得用作其它用途,如有侵犯你的权益,请联系我们,我们将于24小时内进行删除,谢谢你的配合!1阅读是一款开源免费的无人维护的电子书阅读应用程序。作者感言:如今的电子小说阅读应用总是在不断的添加广告,作为一个程序猿这是受不了的,于是开源的阅读软件来,你不用再担心广告。本软件fork一个无人维护的阅读软件,经过大量修改,实现自定义书源,…

    2022年6月21日
    1.8K
  • 软件工程师待遇怎么样?软件工程师薪水到底有多高?「建议收藏」

    软件工程师待遇怎么样?软件工程师薪水到底有多高?「建议收藏」随着技术不断进步,行业对软件开发技能的需求急剧上升。在此情况下,软件工程师(程序员)薪水上涨便很正常。通常来说,个人薪水是高是低,则与自身积累的经验、所处的地点以及产业分不开。据国际调研机构IDC在报告中公开的数据:2018年,全球有2230万名的软件工程师;其中,全职程序员1165万名,兼职人员635万名,非专业人员430万名。美国拥有最多的软件工程师,651017人;其次是中国,183…

    2022年9月2日
    8
  • KindEditor配置ctrl+enter提交

    KindEditor配置ctrl+enter提交今天花费了一些时间去想怎么配置,网上也没有直接找到这方面的资料。后面突然看到一个网页,提交也是用了相同的编辑器。就学习了一下。//创建编辑器functioncreateEditor(){KindEditor.ready(function(K){ChatEditor=K.create(‘textarea.win_chat_textarea’,{width:’100%’,

    2022年10月10日
    3
  • 苹果CMS

    苹果CMS

    2021年10月31日
    70

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号