【发布时间】:2021-08-21 23:05:36
【问题描述】:
Docker中使用的tiniinit-process提到默认不激活进程组杀,并给出如下示例:
docker run krallin/ubuntu-tini sh -c 'sleep 10'
如果我运行它,然后立即按 Ctrl-C,我确实需要等待 10 秒,直到子进程退出。
但是,如果我使用 bash 而不是 sh:
docker run krallin/ubuntu-tini bash -c 'sleep 10'
按Ctrl-C,进程立即退出。
为什么sh(符号链接到dash)和bash 对这个子进程的行为不同?
还有Bash是怎么杀掉子进程的,我还以为Bash默认不传播信号呢?
【问题讨论】:
-
我相信
bash已优化为在可能的情况下使用exec替换自己。在这种情况下,简单的命令sleep替换了bash。另一方面,dash可能只是分叉一个新进程并等待它,让它响应信号。 -
如果是这种情况(很可能),
sh -c 'exec sleep 10'将使行为保持一致。 -
@Peter, btw,
bash -c 'sleep 10; exit'会阻止这种优化:因为sleep不再是最后一个命令,所以shell 不能再隐含exec。
标签: bash docker sh child-process tini