我使用过的Linux命令之kill - 终止进程/发送信号
我使用过的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 ~]##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命令系列总目录