进程的控制与删除
使用kill命令可以终止进程.通常,终止一个前台进程可以使用ctrl+C键,但是对于一个后台进程就必须使用kill命令来终止,我们需要先使用ps/pidof/pstree/top等工具获取进程PID,然后使用kill命令来杀掉进程.kill命令是通过向进程发送指定的信号来结束相应进程的.在默认情况下,采用编号为15的TREM信号.TERM信号将终止所有不能获取该信号的进程.对于那些可以获取该信号的进程就要用编号为9的kill信号,强行”杀掉”该进程.
kill命令详解
1.格式:
kill [参数] [进程号,也就是PID]
2.功能:
发送指定的信号到相应进程.不指定型号将发送SIFTERM(15)终止指定进程.如果无法终止该进程可以使用”-KILL”参数,其发送的信号为SIGKILL(9),将强制结束进程,使用ps命令或者jobs命令可以查看进程号.root用户将影响用户的进程,非root用户只能影响自己的进程.
3.参数
参数 |
说明 |
-l(小写字母) |
信号,如果不加信号的编号参数,则使用”-l”参数会列出全部的信号名称 |
-a |
当初李当前进程是,不限制命令名或进程号的对应关系 |
-p |
指定kill命令只打印相关进程的进程号,而不发送任何信号 |
-s |
指定发送信号 |
-u |
指定用户 |
注意:
1.kill命令可以带信号号码选项,也可以不带.如果没有信号好吗,kill命令就会发出终止信号(15),这个信号可以被进程捕获,是的进程在推出之前可以清理并释放资源.也可以用kill向进程发送特定的信号.例如:
kill -2 123 //它的效果等同于在前台运行PID为123的进程同时按下Ctrl+C键.但是,普通用户只能使用不带signal参数的kill命令或最多使用-9信号.
2.kill可以带有进程ID号作为参数.当用kill想这些进程发送信号时,必须是这些进程的主人.如果试图撤销一个没有撤销权限的进程或撤销一个不存在的进程,就会得到一个错误信息.
3.可以向多个进程发信号或终止它们.
4.当kill成功的发送了信号后,shell会在屏幕上显示出进程的终止信息.有时这个信息不会马上显示,只有当按下Enter键使shell的命令提示符再次出现时,才会显示出来.
5.应注意,信号使进程强行终止,这常会带来一些副作用,如数据丢失后者终端无法恢复到正常状态.发送信号时必须小心,只有在万不得已时,采用kill信号(9),因为进程不能首先捕获它要撤销所有的后台作业,可以输入kill 0.因为有些在后台运行的命令会启动多个进程,跟踪并找到所有要杀掉的进程的PID是件很麻烦的事.这时,使用kill 0来终止所有当前shell启动的进程,是个有效的方法.
4.案例
案例1:
#kill -l //列出所有的信号名称
在输出中,只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略.以下是常用的信号:
信号名称 |
编号 |
说明 |
HUP |
1 |
终端断线 |
INT |
2 |
中断(同Ctrl+C) |
QUIT |
3 |
退出(同Ctrl) |
TERM |
15 |
终止 |
KILL |
9 |
强制终止 |
CONT |
18 |
继续(与STOP相反,fg/bg命令) |
STOP |
19 |
暂停(同Ctrl+Z) |
案例2:得到指定信号的数值(不区分大小写)
#kill -l term
15
#kill -l kill
9
#kill -l SIGKILL
案例3:配合ps命令,使用kill杀掉进程
#ps -ef | grep vim //得到关于vim进程的PID,比如得到的PID是111
#kill 111 //删除vim进程
案例4:彻底杀死进程
#kill -9 111
案例5:杀死指定用户的所有进程
#kill -9 $(ps -ef| grep username) //方法1
#kill -u username //方法2
案例6:init进程(PID为1)是不可杀的
#kill -9 1
这是因为init是linux系统中不可缺少的程序之一 .所谓的init进程,他是一个有内核启动的用户级进程.内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程.所以,init时钟是第一个进程(其进程编号始终为1).其他所有进程都是init进程的子孙.init进程是不可杀死的.不够貌似init进程的作用正在被逐渐弱化.