You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Shell脚本中带&的exec命令后台运行的进程启动机制疑问

关于exec与&结合的进程启动逻辑

先明确核心点:exec本身确实会替换当前shell进程,但当它和&结合时,exec是在后台子shell中执行的,这就和单独用exec的行为完全不同了,拆解你的脚本和ps输出来看:

脚本执行过程

  • 第一行exec command1 &:
    脚本的主shell(PID 1)会先fork出一个后台子shell,然后在这个子shell里执行exec command1——子shell被command1直接替换,所以最终的command1进程(PID48)的父进程还是主shell(PID1),而主shell本身不会被替换,继续往下执行。
  • 主shell执行sleep 10,等待10秒后,执行exec command2 &:
    逻辑和第一行完全一致:主shell再fork一个后台子shell,子shell被command2替换,得到PID133的进程,父进程依然是主shell(PID1)。
  • 最后主shell执行sleep 10,等待结束后脚本退出。

对应ps输出的解释

你看到的ps结果里:

  • bash mainscript.sh(PID1)是脚本的主进程,全程没被替换,一直在执行脚本里的命令
  • command1和command2的PPID都是1,因为它们都是主shell直接fork出的子进程(准确说是fork出的子shell被exec替换后的进程)

简单说:exec + &的组合,本质是后台启动一个进程,这个进程替换了后台子shell,但父进程还是原脚本的主shell,原shell不受影响,继续执行后续代码。

内容的提问来源于stack exchange,提问作者swamoch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 08:33:18