用kill向进程发送信号


用kill向进程发送信号 使用ctrl+c组合键可以强制终止前台作业进程。有没有方法可以直接终止或者重启后台作业进程呢?
可以使用kill命令轻松杀掉一个运行中进程,kill的英文翻译为杀死,但是kill命令可不只是用来杀掉进程的。 kill其实是用来给进程发送信号(signal)的。其中"杀掉进程"只是kill发送给进程众多信号中的一个。
可以用-l选项查看kill可以发送给进程的信号:

              root@peter-VirtualBox:~# kill -l
              1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
              6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
              11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
              16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
              21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
              26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
              31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
              38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
              43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
              48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
              53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
              58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
              63) SIGRTMAX-1	64) SIGRTMAX	
            
可以看到kill可以发送的信号有64个,这里面我们先重点了解几个常用信号,其他的信号可以以后慢慢熟悉。
编号为1的信号SIGHUP,进程收到该信号会重新读取进程的配置文件,类似于重启(reload)进程;
编号为2的信号SIGINT,这个就是强制终止进程的信号,我们在前台通过ctrl+c组合键强制结束进程,其实就是给进程发送的SIGINT信号;
编号为9的信号SIGKILL,立刻强制删除一个进程;
编号为15的信号SIGTERM,以正常的流程终止一个进程;
我们平时所说的用kill杀掉一个进程,其实用的是编号为9的那个信号SIGKILL。 如果想要将某个进程杀掉,只需要将SIGKILL信号发送给该进程就可以了。
kill命令的常用格式如下所示:
              [root@initroot ~]# kill -signum/signame %jobnumber/pid
              [root@initroot ~]# kill -l
            
上面kill给一个进程发送信息,进程可以使用pid号或者作业编号,使用作业编号的话前面必须加上%;
发送的信号既可以是用信号编号,也可以使用信号名字。
例如给一个pid为888,作业编号为6的作业进程发送SIGKILL,可以有四种方式:
              [root@initroot ~]# kill -9 888
              或者
              [root@initroot ~]# kill -SIGKILL 888
              或者
              [root@initroot ~]# kill -9 %6
              或者
              [root@initroot ~]# kill -SIGKILL %6
            
用jobs找出刚才的find作业编号,然后杀掉该作业进程:
              [root@initroot ~]# jobs
              [1]+ Stopped vim ~/.bashrc
              [2] Stopped find / -print
            
              [root@initroot ~]# kill -9 %2; jobs
              [1]+ Stopped vim ~/.bashrc
              [2] Killed find / -print
            
编号为2的作业进程状态变成killed了,过几秒再次通过jobs观察会发现编号为2的作业已经没有了。
将vim作业进程正常终止:
              [root@initroot ~]# jobs
              [1]+ Stopped vim ~/.bashrc
              [root@initroot ~]# kill -SIGTERM %1
            
用kill命令属于结束进程的非常规手段。是在进程出现问题时候的解决方案。 实际工作中我们并不会这么结束掉vim进程。而是先将vim进程挪到前台运行,然后在vim环境中保存退出vim。

kill命令向作业发送信号

initroot编辑整理,转载请注明www.initroot.com

100次点赞 100次阅读