前言
今天正在写docker的时候,发现了一个bug, run -d top ,ps -ef 查看不到这个进程。
为了解决这个问题,找了一圈都没有发现一些可用的信息。并且还有还有人也遇到相同的问题。
kernal : 4.15.0 , 如果感兴趣的化,可以复现一下这个问题。
核心代码 改动的地方:
cmd.SysProcAttr = &syscall.SysProcAttr{
Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWPID | syscall.CLONE_NEWNS |
syscall.CLONE_NEWNET | syscall.CLONE_NEWIPC | syscall.CLONE_NEWUSER,
UidMappings: []syscall.SysProcIDMap{
{
ContainerID: 0, HostID: syscall.Getuid(), Size: 1,},},
GidMappings: []syscall.SysProcIDMap{
{
ContainerID: 0,HostID: syscall.Getgid(),Size: 1,},},
if tty {
cmd.Stderr = os.Stderr
cmd.Stdin = os.Stdin
}
cmd.Stdout = os.Stdout
用上面的代码运行,运行 sudo ./mydocker run -d top , 在宿主机上跑 ps -ef | grep top 是找不到 运行 top 这个进程。
开始我以为是没有执行这个命令,找了半天都感觉没有任何问题。然后是换 ls 命令试了一下,发现是有输出的。也就是说执行了这个命令。出现了一种可能, top 命令被秒退了,所以找不到这个进程。 然后就换个时间长的命令 ls -r / (第一个反应是它)…
现在用 ps -ef | grep ls 是能找到这个进程的。
第二个命令是 top -b, 然后将输出重新定向到文件里。 然后运行。
现在查看这个文件的大小,它是不断的递增,也就是说 top 命令是在运行的。 或者你在用 ps -ef | grep top 。
此时也是可以查看到 top 命令了。