KILL PKILL KILLALL
$ 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
SIGKILL(9) 不能被捕获,用户不能注册自己的handler
SIGTERM(15) 允许用户注册自己的handler,kill命令缺省发出
- kill根据pid结束
- pkill根据进程名批量结束
- killall根据进程名批量结束
- kill默认发送 15(TERM)信号终止进程
查看dd命令进度,发送USR1信号,dd命令收到回打出进度
watch -n 1 killall -USR1 dd
每一秒打印dd进度
进程收到信号处理:
- 第一个选择是忽略(Ignore),就是对这个信号不做任何处理,但是有两个信号例外,对于 *SIGKILL 和 SIGSTOP *这个两个信号,进程是不能忽略的。这是因为它们的主要作用是为 Linux kernel 和超级用户提供删除任意进程的特权。
- 第二个选择,就是捕获(Catch),这个是指让用户进程可以注册自己针对这个信号的 handler。具体怎么做我们目前暂时涉及不到,你先知道就行,我们在后面课程会进行详细介绍。 对于捕获,SIGKILL 和 SIGSTOP 这两个信号也同样例外,这两个信号不能有用户自己的处理代码,只能执行系统的缺省行为
- 还有一个选择是缺省行为(Default),Linux 为每个信号都定义了一个缺省的行为,你可以在 Linux 系统中运行 man 7 signal来查看每个信号的缺省行为。对于大部分的信号而言,应用程序不需要注册自己的 handler,使用系统缺省定义行为就可以了。
僵尸进程
- 每一个 Linux 进程在退出的时候都会进入一个僵尸状态(EXIT_ZOMBIE);
- 僵尸进程如果不清理,就会消耗系统中的进程数资源,最坏的情况是导致新的进程无法启动;
- 僵尸进程一定需要父进程调用 wait() 或者 waitpid() 系统调用来清理,这也是容器中 init 进程必须具备的一个功能。
清理僵尸进程的两个思路
- kill掉僵尸进程的父进程,此时僵尸进程会归附到init(1)进程下,而init进程一般都有正常的wait()或watipid()回收机制。
- 利用dumb-init/tini之类的小型init服务来解决僵尸进程
僵尸进程是进程的一个状态, 只要进程退出就会有这状态。清理的僵尸进程的是它的父进程。 这个和服务进程运行时间长了之后,通过重启进程去清理泄漏的资源,比如内存或者文件fd, 是两个概念。 SIGTERM/SIGKILL是不能够杀死僵尸进程