Docker中的Java 9 ProcessHandle API:PID值和可见进程的差异
在一个简单的“Docked”Java程序上尝试Java9中的新API时,我发现在检索正在运行的进程的进程ID时,在行为方面存在差异。特别是在调用该方法时,Docker上生成的PID与主机上显示的本机ID不同,尽管文档称该方法“返回进程的本机进程ID”。此外,Docker中的Java 9 ProcessHandle API:PID值和可见进程的差异,java,docker,java-9,processhandle,Java,Docker,Java 9,Processhandle,在一个简单的“Docked”Java程序上尝试Java9中的新API时,我发现在检索正在运行的进程的进程ID时,在行为方面存在差异。特别是在调用该方法时,Docker上生成的PID与主机上显示的本机ID不同,尽管文档称该方法“返回进程的本机进程ID”。此外,ProcessHandle.allprocesss()的结果之间存在差异 为了演示,以下程序执行以下操作: 打印当前进程的PID 生成一个子进程,该子进程休眠几秒钟(以便有时间打印其信息) 最后打印所有可见的流程 正常运行应用程序时(无Do
ProcessHandle.allprocesss()
的结果之间存在差异
为了演示,以下程序执行以下操作:
正常运行应用程序时(无Docker),输出如预期;它包括当前进程、其子进程和许多其他可见进程的本机PID
### Current process info ###
Process ID: 7756
Process arguments: []
Process executable: D:\Dev\Java\jdk-9\bin\java.exe
Process command line:
Process start time: 2017-10-08T12:23:46.474Z
Process total cputime accumulated: PT0.4368028S
Process user: manouti
Spawning: jshell --startup ./sleep.txt
### Visible processes info ###
... skipping some output
Process ID: 8060
Process arguments: []
Process executable: C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
Process command line:
Process start time: 2017-10-08T12:20:04.758Z
Process total cputime accumulated: PT10.4676671S
Process user: manouti
Process ID: 7756
Process arguments: []
Process executable: D:\Dev\Java\jdk-9\bin\java.exe
Process command line:
Process start time: 2017-10-08T12:23:46.474Z
Process total cputime accumulated: PT0.8268053S
Process user: manouti
Process ID: 8080
Process arguments: []
Process executable: D:\Dev\Java\jdk-9\bin\jshell.exe
Process command line:
Process start time: 2017-10-08T12:23:46.992Z
Process total cputime accumulated: PT0.0780005S
Process user: manouti
当我在Docker上运行时(Windows 7,Docker在boot2docker Linux上运行时,),可以看到更小的进程子集,并且PID与主机上的进程不匹配
$docker运行测试/java9进程句柄示例:1.0
运行上述命令后,主机将显示以下进程:
但是,下面生成的程序输出显示的是PID 1和16,而不是4291和4333。可见进程包括容器进程和派生进程
我想知道这是否是意料之中的。由于我对Docker比较陌生,如果这是由容器造成的限制,如果有人能解释一下,我会很高兴(我也不确定这是否可以在不同的Docker设置上重现,例如Linux或Windows Server上的Docker)。否则,在容器中应用API时,这是API本身的限制吗(Javadocs中似乎没有提到)
这并不是Java或Java9特有的,它是一个docker主题 每个容器都有自己的PID命名空间,并且在容器中运行的第一个进程的PID为1 有关这方面的更多信息,请参阅,特别是: 默认情况下,所有容器都启用了PID命名空间 PID命名空间提供了进程的分离。PID名称空间删除系统进程的视图,并允许重用进程ID,包括PID 1
因此,需要使用
--pid=host
运行容器,以允许返回文档中暗示的预期值(由操作系统分配的本机pid)
它还使返回系统的进程可见,而不仅仅是绑定到容器的进程。我几乎可以预料到这一点。容器不应该知道主机的PID序列。可能重复。。这与Java或其IMO版本没有太大关系。您可以按照答案中VonC的链接了解详细信息。移动到这里,只是为了进一步澄清,您的问题是如何在Docker中使用ProcessHandler(我对其内容表示怀疑),还是在Docker和host中获得不同的PID(在这种情况下,我认为是重复的)?Java中的本机pid是您通常通过
ps
命令看到的。这与进程ID不同,例如jps
显示。这些是Java内部进程ID。Docker容器中的本机ID始终是带名称空间的ID,这就是将内容放在容器中不公开主机数据(以及来自其他容器的数据)@P.J.Meisch的意义,尽管文档中说“本机进程ID是操作系统分配给进程的标识号”。也许文档将来可以考虑到这一差异。所以问题是,在集装箱化环境中,操作系统是什么?我知道这是容器,所以你会得到容器ID。@P.J.Meisch我发现我很难将操作系统的概念与容器联系起来(特别是容器通常是轻量级的,并且由于没有实现操作系统而与VM不同)。也许操作系统可以被认为是Docker引擎本身。但是,现在这种行为更加明显了。我只是对文档有点挑剔:)一个容器正在你的主机上运行,但它有自己的IP、文件系统、PID等。例如,一个基于ubuntu的容器在Mac OSX上的docker主机上运行。处理器是一样的,但是容器进程看到的文件是ubuntu文件和库,所以对于在ubuntu操作系统中运行的容器来说。那么,操作系统是由什么组成的呢?基本上是一组文件、库等,它们在不同的容器中是不同的。在和docker一起工作一段时间后,你会习惯的。这甚至不是docker特有的,任何使用上述pid名称空间的东西都会遇到这种情况。您可以通过取消共享
在最低级别执行此操作,与所有其他名称空间轴无关
### Current process info ###
Process ID: 7756
Process arguments: []
Process executable: D:\Dev\Java\jdk-9\bin\java.exe
Process command line:
Process start time: 2017-10-08T12:23:46.474Z
Process total cputime accumulated: PT0.4368028S
Process user: manouti
Spawning: jshell --startup ./sleep.txt
### Visible processes info ###
... skipping some output
Process ID: 8060
Process arguments: []
Process executable: C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
Process command line:
Process start time: 2017-10-08T12:20:04.758Z
Process total cputime accumulated: PT10.4676671S
Process user: manouti
Process ID: 7756
Process arguments: []
Process executable: D:\Dev\Java\jdk-9\bin\java.exe
Process command line:
Process start time: 2017-10-08T12:23:46.474Z
Process total cputime accumulated: PT0.8268053S
Process user: manouti
Process ID: 8080
Process arguments: []
Process executable: D:\Dev\Java\jdk-9\bin\jshell.exe
Process command line:
Process start time: 2017-10-08T12:23:46.992Z
Process total cputime accumulated: PT0.0780005S
Process user: manouti
### Current process info ###
Process ID: 1
Process arguments: [ProcessHandleExamples]
Process executable: /usr/lib/jvm/java-9-openjdk-amd64/bin/java
Process command line: /usr/lib/jvm/java-9-openjdk-amd64/bin/java ProcessHandleExamples
Process start time: 2017-10-08T14:17:48.420Z
Process total cputime accumulated: PT0.35S
Process user: root
Spawning: jshell --startup ./sleep.txt
### Visible processes info ###
Process ID: 1
Process arguments: [ProcessHandleExamples]
Process executable: /usr/lib/jvm/java-9-openjdk-amd64/bin/java
Process command line: /usr/lib/jvm/java-9-openjdk-amd64/bin/java ProcessHandleExamples
Process start time: 2017-10-08T14:17:48.420Z
Process total cputime accumulated: PT0.6S
Process user: root
Process ID: 16
Process arguments: [--startup, ./sleep.txt]
Process executable: /usr/lib/jvm/java-9-openjdk-amd64/bin/jshell
Process command line: /usr/lib/jvm/java-9-openjdk-amd64/bin/jshell --startup ./sleep.txt
Process start time: 2017-10-08T14:17:49.070Z
Process total cputime accumulated: PT0.03S
Process user: root