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,使用系统缺省定义行为就可以了。

僵尸进程

  1. 每一个 Linux 进程在退出的时候都会进入一个僵尸状态(EXIT_ZOMBIE);
  2. 僵尸进程如果不清理,就会消耗系统中的进程数资源,最坏的情况是导致新的进程无法启动;
  3. 僵尸进程一定需要父进程调用 wait() 或者 waitpid() 系统调用来清理,这也是容器中 init 进程必须具备的一个功能。

清理僵尸进程的两个思路

  • kill掉僵尸进程的父进程,此时僵尸进程会归附到init(1)进程下,而init进程一般都有正常的wait()或watipid()回收机制。
  • 利用dumb-init/tini之类的小型init服务来解决僵尸进程

僵尸进程是进程的一个状态, 只要进程退出就会有这状态。清理的僵尸进程的是它的父进程。 这个和服务进程运行时间长了之后,通过重启进程去清理泄漏的资源,比如内存或者文件fd, 是两个概念。 SIGTERM/SIGKILL是不能够杀死僵尸进程