linux kill用法、killall、pkill、xkill

一. 终止进程的工具 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 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的话,其下的子进程也会跟着死掉; [root@localhost ~]# kill 4840 注:杀掉4840这个进程; [root@localhost ~]# ps -auxf |grep httpd 注:查看一下会有什么结果?是否是httpd服务器仍在运行? [root@localhost ~]# kill 4830 注:杀掉httpd的父进程; [root@localhost ~]# ps -aux |grep httpd 注:查看httpd的其它子进程是否存在,httpd服务器是否仍在运行? 对于僵尸进程,能够用kill -9 来强制终止退出; 好比一个程序已经完全死掉,若是kill 不加信号强度是没有办法退出,最好的办法就是加信号强度 -9 ,后面要接杀父进程;好比; [root@localhost ~]# 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 或 [root@localhost ~]# pgrep -l gaim 5031 gaim [root@localhost ~]# kill -9 5031 2. killall killall 经过程序的名字,直接杀死全部进程,我们简单说一下就好了。 用法:killall 正在运行的程序名 killall 也和ps或pgrep 结合使用,比较方便;经过ps或pgrep 来查看哪些程序在运行; 举例: [root@localhost beinan]# pgrep -l gaim 2979 gaim [root@localhost beinan]# killall gaim 3. pkill pkill 和killall 应用方法差很少,也是直接杀死运行中的程序;若是您想杀掉单个进程,请用kill 来杀掉。 应用方法: #pkill 正在运行的程序名 举例: [root@localhost beinan]# pgrep -l gaim 2979 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 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中kill的妙用,由于这是你进入维护Linux系统领域的门票。这些知识可以让你像作外科手术同样对系统进行维护,而不用在遇到问题时每一次都从新启动系统,就像咱们知道的某些蹩脚的操做系统那样。 资源 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资源消灭一个客户程序
相关文章
相关标签/搜索