Docker中的Java 9 ProcessHandle API:PID值和可见进程的差异

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

在一个简单的“Docked”Java程序上尝试Java9中的新API时,我发现在检索正在运行的进程的进程ID时,在行为方面存在差异。特别是在调用该方法时,Docker上生成的PID与主机上显示的本机ID不同,尽管文档称该方法“返回进程的本机进程ID”。此外,
ProcessHandle.allprocesss()
的结果之间存在差异

为了演示,以下程序执行以下操作:

  • 打印当前进程的PID
  • 生成一个子进程,该子进程休眠几秒钟(以便有时间打印其信息)
  • 最后打印所有可见的流程

  • 正常运行应用程序时(无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