前言
我们在一些重启脚本中,经常可以看到在kill进程之后,会sleep一段时间,这是为什么呢?下面,就让我们来研究一下
原因
我们知道kill命令是发送指定的信号到相应进程,kill命令的工作原理是,向Linux系统的内核发送一个系统操作信号和某个程序的进程标识号,然后系统内核就可以对进程标识号指定的进程进行操作。我们常用是15(SIGTERM)和9(SIGKILL),没有信息编号,默认是15
9和15的意思:
9 (KILL):杀死一个进程,强行终止一个进程,这可能会带来一些副作用,如数据丢失或者终端无法恢复到正常状态。
15 (TERM):正常停止一个进程,这个信号可以被进程捕获,使得进程在退出之前可以清理并释放资源,相当于让进程正常终止。
由此,我们可以推断出kill进程并不是立即生效的,而是具有一定延时的。
在所有kill信号中,除了9无条件终止进程之外,其他信号都有可能被阻塞或者忽略,而且就算是信号9,也会先被放到pending队列,等到下一次cpu调度才会生效,所以一般我们kill进程之后会sleep一会,保证进程被杀死,否则可能会出现进程未被杀死而导致重启失败。
额外:我们可以使用kill -l 查看所有的kill信号值
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