##kill命令的原理 kill命令在linux中用来结束进程。但实际上,并非kill杀死了进程,kill只是向内核发送了操做系统信号和进程标示号(PID),由内核负责处理须要结束的进程。 使用kill -l
能够查看支持发送的信号:linux
- SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
这些信号的解释能够经过man 7 signal
来查看。 kill除了测试程序遇到各类状况的退出状态,经常使用的其实只有三个:session
wiki百科测试
UNIX中进程组织结构为 session (会话)包含一个前台进程组及一个或多个后台进程组,一个进程组包含多个进程。一个session可能会有一个session首进程,而一个session首进程可能会有一个控制终端。一个进程组可能会有一个进程组首进程。进程组首进程的进程ID与该进程组ID相等。这儿是可能会有,在必定状况之下是没有的。与终端交互的进程是前台进程,不然即是后台进程。 SIGHUP会在如下3种状况下被发送给相应的进程: 一、终端关闭时,该信号被发送到session首进程以及做为job提交的进程(即用 & 符号提交的进程)
二、session首进程退出时,该信号被发送到该session中的前台进程组中的每个进程
三、若父进程退出致使进程组成为孤儿进程组,且该进程组中有进程处于中止状态(收到SIGSTOP或SIGTSTP信号),该信号会被发送到该进程组中的每个进程。
系统对SIGHUP信号的默认处理是终止收到该信号的进程。因此若程序中没有捕捉该信号,当收到该信号时,进程就会退出。操作系统
除此以外这个信号时能够被捕捉的,不少服务(Apache,Ngnix)将这个信号视为relaod,即重启。code
关于这个信号有一个颇有意思的命令:nohup。
这个命令就跟它的名字同样,这个命令的做用就是试经过它运行的进程彻底忽略SIGHUP信号。通常而言,若是你以SSH等方式链接到远程主机,当你但愿运行一些程序而且当你退出后依然能在后台运行的时候,除了at命令,你还可使用nohup这个命令。 。 用法:进程
nohup COMMAND #前景工做 nohup COMMAND & #背景工做
测试:ip
nohup ping 127.0.0.1 &
nohup: 忽略输入并把输出追加到"nohup.out"资源
pgrep ping
10363get
ctrl+D pgrep ping
10363it
SIGKILL有几个特性须要注意:
僵尸进程不能被杀死,由于它们已经死亡,只等待它们的父进程回收它们。
处于阻塞状态的进程不会死亡,直到它们再次醒来。
init进程是特殊的:它不得到它不想处理的信号,所以它能够忽略SIGKILL。
由于SIGKILL不给进程任何在终止时作清理操做的机会,在大部分系统关闭过程当中,在采起SIGKILL以前,使用信号SIGTERM使进程终止的尝试先被做出。
即便SIGKILL被发送给它,一个正在不可中断睡眠的进程也可能不会终止(而且释放它的资源)。这是少数几个一个UNIX系统可能须要被从新启动来解决临时软件问题的例子中的一个。
关于僵尸进程能够参考wiki,简单来讲就是父进程没有wait/waitpid的已经结束的进程。