为何不同Ubuntu环境下执行/proc/1/exe --version结果存在差异?
/proc/1/exe --version在本地Ubuntu和upstart容器中结果不同? 这是因为/proc/1/exe是指向系统(或容器)中PID为1的进程的可执行文件的符号链接,而PID 1进程在你的本地机器和Docker容器里完全不一样:
1. 本地Ubuntu 16.04环境
Ubuntu 16.04默认使用systemd作为初始化(init)系统,所以系统启动后PID 1的进程就是systemd。当你执行:
sudo /proc/1/exe --version
本质上是直接调用了systemd的可执行文件并传入--version参数,所以输出的自然是systemd的版本信息:
systemd 229 +PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD -IDN
2. ubuntu-upstart Docker容器环境
ubuntu-upstart镜像虽然是基于upstart初始化系统构建的,但如果你的容器启动时没有指定以upstart作为PID 1进程(比如你直接启动了bash进入容器),那么容器内的PID 1进程就是bash。这时候/proc/1/exe指向的是bash的可执行文件,执行--version参数就会输出bash的版本信息:
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu) Copyright (C) 2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later ...
验证方法
你可以在容器里执行ps -p 1来确认PID 1的进程是什么:
ps -p 1
如果输出显示进程是bash,那就对应了你看到的结果;如果要让容器以upstart作为PID 1,你需要在启动容器时指定对应的命令(比如/sbin/init),这时候再执行/proc/1/exe --version就会得到upstart的版本信息了。
内容的提问来源于stack exchange,提问作者codeofnode

