我使用过的Linux命令之kill - 终止进程/发送信号

wpeng 2010-12-20

我使用过的Linux命令之kill - 终止进程/发送信号

用途说明

kill命令用于终止指定的进程(terminate a process),是Unix/Linux下进程管理的常用命令。通常,我们在需要终止某个或某些进程时,先使用ps/pidof/pstree/top等工具获取进程PID,然后使用kill命令来杀掉该进程。kill命令的另外一个用途就是向指定的进程或进程组发送信号(The  command kill sends the specified signal to the specified process or process group),或者确定进程号为PID的进程是否还在。比如,有许多程序都把SIGHUP信号作为重新读取配置文件的触发条件。

在Bash中,kill命令是个Shell内建命令,为什么呢?原因有两个:第一个原因,Bash可以进行任务管理(&,Ctrl+Z,bg,fg,kill %jobid等指令),如果kill只是一个外部命令,那么在需要终止某个任务时就会很难办,因为任务是与终端关联的,反过来,如果kill命令是shell内建命令,就可以很方便的采用kill %jobid的形式去杀掉指定任务(似乎这个原因还不是很充分);第二个原因,是更加重要的,如果要杀掉某个进程还得来启动一个名为kill的子进程,那么在达到允许创建的进程数量上限时,连kill进程本身都无法创建了,还怎么来杀掉其他进程呢!(Kill is a shell builtin for two reasons: it allows job IDs to be used instead of process IDs, and, if you have reached the limit on processes that you can create, you don't have to start a process to kill another one.)

常用参数

格式:kill <pid>

格式:kill -TERM <pid>

发送SIGTERM信号到指定进程,如果进程没有捕获该信号,则进程终止(If no signal is specified, the TERM signal is sent.  The TERM signal will kill processes which do not catch this signal.)

格式:kill -l

列出所有信号名称(Print a list of signal names.  These are found in /usr/include/linux/signal.h)。只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。下面是常用的信号:

HUP     1    终端断线

INT2中断(同Ctrl+C)

QUIT3退出(同Ctrl+\)

TERM15终止

KILL9强制终止

CONT18继续(与STOP相反,fg/bg命令)

STOP    19    暂停(同 Ctrl + Z)

格式:kill -l <signame>

显示指定信号的数值。

格式:kill -9 <pid>

格式:kill -KILL <pid>

强制杀掉指定进程,无条件终止指定进程。

格式:kill %<jobid>

格式:kill -9 %<jobid>

杀掉指定的任务(使用jobs命令可以列出)

使用示例

示例一 kill命令是什么类型的命令

[root@new55 ~]# type -a kill

killisashellbuiltin

killis/bin/kill

kill is /usr/bin/kill

[root@new55 ~]# help kill

kill:kill[-ssigspec|-nsignum|-sigspec]pid|jobspec...orkill-l[sigspec]

SendtheprocessesnamedbyPID(orJOBSPEC)thesignalSIGSPEC.If

SIGSPECisnotpresent,thenSIGTERMisassumed.Anargumentof`-l'

liststhesignalnames;ifargumentsfollow`-l'theyareassumedto

besignalnumbersforwhichnamesshouldbelisted.Killisashell

builtinfortworeasons:itallowsjobIDstobeusedinsteadof

processIDs,and,ifyouhavereachedthelimitonprocessesthat

    you can create, you don't have to start a process to kill another one.

[root@new55 ~]#

示例二 列出所有信号名称

[root@new55 ~]# kill -l

1)SIGHUP2)SIGINT3)SIGQUIT4)SIGILL

5)SIGTRAP6)SIGABRT7)SIGBUS8)SIGFPE

9)SIGKILL10)SIGUSR111)SIGSEGV12)SIGUSR2

13)SIGPIPE14)SIGALRM15)SIGTERM16)SIGSTKFLT

17)SIGCHLD18)SIGCONT19)SIGSTOP20)SIGTSTP

21)SIGTTIN22)SIGTTOU23)SIGURG24)SIGXCPU

25)SIGXFSZ26)SIGVTALRM27)SIGPROF28)SIGWINCH

29)SIGIO30)SIGPWR31)SIGSYS34)SIGRTMIN

35)SIGRTMIN+136)SIGRTMIN+237)SIGRTMIN+338)SIGRTMIN+4

39)SIGRTMIN+540)SIGRTMIN+641)SIGRTMIN+742)SIGRTMIN+8

43)SIGRTMIN+944)SIGRTMIN+1045)SIGRTMIN+1146)SIGRTMIN+12

47)SIGRTMIN+1348)SIGRTMIN+1449)SIGRTMIN+1550)SIGRTMAX-14

51)SIGRTMAX-1352)SIGRTMAX-1253)SIGRTMAX-1154)SIGRTMAX-10

55)SIGRTMAX-956)SIGRTMAX-857)SIGRTMAX-758)SIGRTMAX-6

59)SIGRTMAX-560)SIGRTMAX-461)SIGRTMAX-362)SIGRTMAX-2

63)SIGRTMAX-164)SIGRTMAX

[root@new55 ~]#
/usr/include/linux/signal.h 写道
#define SIGHUP 1

#defineSIGINT2

#defineSIGQUIT3

#defineSIGILL4

#defineSIGTRAP5

#defineSIGABRT6

#defineSIGIOT6

#defineSIGBUS7

#defineSIGFPE8

#defineSIGKILL9

#defineSIGUSR110

#defineSIGSEGV11

#defineSIGUSR212

#defineSIGPIPE13

#defineSIGALRM14

#defineSIGTERM15

#defineSIGSTKFLT16

#defineSIGCHLD17

#defineSIGCONT18

#defineSIGSTOP19

#defineSIGTSTP20

#defineSIGTTIN21

#defineSIGTTOU22

#defineSIGURG23

#defineSIGXCPU24

#defineSIGXFSZ25

#defineSIGVTALRM26

#defineSIGPROF27

#defineSIGWINCH28

#defineSIGIO29

#defineSIGPOLLSIGIO

/*

#defineSIGLOST29

*/

#defineSIGPWR30

#defineSIGSYS31

#defineSIGUNUSED31

/*Theseshouldnotbeconsideredconstantsfromuserland.*/

#defineSIGRTMIN32

#define SIGRTMAX _NSIG

示例三 得到指定信号的数值

[root@new55 ~]# kill -l KILL

9

[root@new55~]#kill-lSIGKILL

9

[root@new55~]#kill-lTERM

15

[root@new55~]#kill-lSIGTERM

15

[root@new55 ~]#

示例四 init进程是不可杀的!

init是Linux系统操作中不可缺少的程序之一。所谓的init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始终是第一个进程(其进程编号始终为1)。 其它所有进程都是init进程的子孙。

[root@new55 ~]# kill -HUP 1

[root@new55~]#kill-91

[root@new55 ~]# kill -KILL 1

系统依然在运行。[root@new55 ~]#

示例五 先用ps查找进程,然后用kill杀掉

[root@new55 ~]# ps -ef|grep vim

root33682884016:21pts/100:00:00viminstall.log

root33702822016:21pts/000:00:00grepvim

[root@new55~]#kill3368

[root@new55~]#kill3368

-bash:kill:(3368)-没有那个进程

[root@new55 ~]#

示例六 杀掉指定任务

[root@new55 ~]# tail -f install.log

瀹夎scim-bridge-gtk-0.4.5-9.el5.i386

瀹夎scim-pinyin-0.5.91-16.el5.i386

瀹夎scim-chewing-0.3.1-11.el5.i386

瀹夎scim-chinese-standard-0.0.2-1.el5.i386

瀹夎scim-tables-0.5.6-7.i386

瀹夎scim-qtimm-0.9.4-5.i386

瀹夎scim-tables-chinese-0.5.6-7.i386

瀹夎fonts-chinese-3.02-12.el5.noarch

瀹夎isdn4k-utils-3.2-56.el5.i386

瀹夎stardict-2.4.5-5.i386

Ctrl+Z

[1]+Stoppedtail-finstall.log

[root@new55~]#kill%1

[root@new55~]#kill%1

-bash:kill:(3379)-没有那个进程

[1]+已终止tail-finstall.log

[root@new55 ~]#

问题思考

相关资料

【1】看看Linux    终止进程kill使用    

【2】我的空间我作主linuxkill信号列表

【3】LinuxSenselinuxkill命令的使用

【4】太平洋电脑网Linux的kill命令与信号控制

【5】forfuture1978    linux Kill多个进程

返回 我使用过的Linux命令系列总目录

相关推荐