探索docker停止,程序进程处理

正常的linux进程,除非是kill -9 pid,其他方式的kill程序内都是可以捕获到到,现在在没看源码前想试试docker stop 容器停止到时候,是发什么信号给pid=1的进程的

package main

import "fmt"
import "os"
import "os/signal"

func main() {
        
        sigs := make(chan os.Signal, 1)
        done := make(chan bool, 1)
        
        signal.Notify(sigs)
        go func() {
                sig := <-sigs
                fmt.Println("Got signal:", sig)
                done <- true
        }()
        fmt.Println("awaiting signal")
        <-done
        fmt.Println("exiting")
}

输出

terminated
Got signal: terminated

其实sig的数据结构就是

type Signal interface {
    String() string
    Signal() // to distinguish from other Stringers
}

然后查golang里的Signal table
golang.org/x/sys/unix/zerrors_linux_amd64.go

// Signal table
var signalList = [...]struct {
    num  syscall.Signal
    name string
    desc string
}{
    {1, "SIGHUP", "hangup"},
    {2, "SIGINT", "interrupt"},
    {3, "SIGQUIT", "quit"},
    {4, "SIGILL", "illegal instruction"},
    {5, "SIGTRAP", "trace/breakpoint trap"},
    {6, "SIGABRT", "aborted"},
    {7, "SIGBUS", "bus error"},
    {8, "SIGFPE", "floating point exception"},
    {9, "SIGKILL", "killed"},
    {10, "SIGUSR1", "user defined signal 1"},
    {11, "SIGSEGV", "segmentation fault"},
    {12, "SIGUSR2", "user defined signal 2"},
    {13, "SIGPIPE", "broken pipe"},
    {14, "SIGALRM", "alarm clock"},
    {15, "SIGTERM", "terminated"},
    {16, "SIGSTKFLT", "stack fault"},
    {17, "SIGCHLD", "child exited"},
    {18, "SIGCONT", "continued"},
    {19, "SIGSTOP", "stopped (signal)"},
    {20, "SIGTSTP", "stopped"},
    {21, "SIGTTIN", "stopped (tty input)"},
    {22, "SIGTTOU", "stopped (tty output)"},
    {23, "SIGURG", "urgent I/O condition"},
    {24, "SIGXCPU", "CPU time limit exceeded"},
    {25, "SIGXFSZ", "file size limit exceeded"},
    {26, "SIGVTALRM", "virtual timer expired"},
    {27, "SIGPROF", "profiling timer expired"},
    {28, "SIGWINCH", "window changed"},
    {29, "SIGIO", "I/O possible"},
    {30, "SIGPWR", "power failure"},
    {31, "SIGSYS", "bad system call"},
}

得出结论,docker stop 容器,其实就是和我们平时kill pid是一样的

添加新评论