自己动手写docker -- run -d top, ps -ef 查看不到

前言

今天正在写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 / (第一个反应是它)…


ls - R

现在用 ps -ef | grep ls 是能找到这个进程的。

第二个命令是 top -b, 然后将输出重新定向到文件里。 然后运行。
现在查看这个文件的大小,它是不断的递增,也就是说 top 命令是在运行的。 或者你在用 ps -ef | grep top 。
此时也是可以查看到 top 命令了。
top -b
原 github issues 链接

猜你喜欢

转载自blog.csdn.net/qq_43701555/article/details/108299051
今日推荐