我写了一个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。有人能解释一下第一个案子会发生什么吗?
最佳答案
在这两种情况下,bash
都以PID 1开头。
对于第一个例子,bash
将运行命令"script1.sh && script2.sh"
,首先调用子shell执行script1.sh
,然后另一个子shell执行script2.sh
如果script1.sh
及其子shell没有错误退出。完整输出(即来自ps -ef
)将命令显示为/bin/bash -c "script1.sh && script2.sh"
。
对于第二个示例,bash
运行的是一个命令,实际上是该命令。不需要子shell,exec
可以替换并成为PID 1。
关于linux - 通过&&运行命令时docker容器中进程的PID,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45748034/