通过&&运行命令时,docker容器中进程的PID

时间:2017-08-18 03:25:43

标签: linux docker

我写了一个DOCKERFILE并使用CMD ["/bin/bash", "-c", "script1.sh && script2.sh"来启动容器。

运行容器之后,我发现PID 1的进程是一个带有CMD列bash的进程,而script2.sh是它的子进程。

F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD            
4 S     0     1     0  0  80   0 -  4491 wait   ?        00:00:00 bash           
0 S     0     8     1  0  80   0 -  4494 wait   ?        00:00:00 script2
0 S     0    10     8 99  80   0 - 1632452 futex_ ?      00:01:05 java           
4 S     0    64     0  0  80   0 -  4545 wait   ?        00:00:00 bash           
0 R     0    79    64  0  80   0 -  1785 -      ?        00:00:00 ps

如果我使用CMD [ "/bin/bash", "-c", "script2.sh" ],则PID 1的过程是script2.sh。

有人可以帮助解释第一种情况会发生什么吗?

1 个答案:

答案 0 :(得分:0)

在这两种情况下,bash都以PID 1开始。

对于第一个示例,bash将运行命令"script1.sh && script2.sh",首先调用子shell来执行script1.sh,然后执行另一个子shell来执行script2.sh if script1.sh及其子shell退出时没有错误。完整输出(即来自ps -ef)将命令显示为/bin/bash -c "script1.sh && script2.sh"

对于第二个示例,bash正在运行单个命令,并且基本上是exec该命令。不需要子shell,script2.sh可以替换并成为PID 1。