如何解决为什么 Bash 处理子进程与 Sh 不同
Docker 中使用的 tini init-process 提到进程组杀是默认不开启的,举例如下:
docker run krallin/ubuntu-tini sh -c 'sleep 10'
如果我运行这个,然后立即按 Ctrl-C,我确实需要等待 10 秒直到子进程退出。
但是,如果我使用了 sh
而不是 bash
:
docker run krallin/ubuntu-tini bash -c 'sleep 10'
然后按Ctrl-C,进程立即退出。
为什么 sh
(符号链接到 dash
)和 bash
对这个子进程的行为不同?
还有Bash是怎么杀死子进程的,我还以为Bash默认是不传播信号的?
解决方法
感谢 chepner 和 Charles Duffy 的回答:
bash -c
具有隐式优化,如果可能,它使用 exec
替换自身。 sh
(dash
) 没有这个优化。另见this observation。
验证:
- 使用
bash
的进程树:
❯ docker run --name test --rm --detach krallin/ubuntu-tini bash -c 'sleep 60'
03194d48a4dcc8225251fe1e5de2dcbb901c8a9cfd0853ae910bfe4d3735608d
❯ docker exec test ps axfo pid,ppid,args
PID PPID COMMAND
1 0 /usr/bin/tini -- bash -c sleep 60
7 1 sleep 60
- 使用
sh
的进程树:
❯ docker run --name test --rm --detach krallin/ubuntu-tini sh -c 'sleep 60'
e56f207509df4b0b57f8e6b2b2760835f6784a147b200d798dffad112bb11d6a
❯ docker exec test ps axfo pid,args
PID PPID COMMAND
1 0 /usr/bin/tini -- sh -c sleep 60
7 1 sh -c sleep 60
8 7 \_ sleep 60
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。