# Claude Code Bash `run_in_background` 与 shell `&` 的冲突

## 现象

启动 dev server 时这样写：

```bash
cd frontend && npm run dev > /tmp/log 2>&1 &
echo "started pid=$!"
```

配合 `Bash` 工具的 `run_in_background: true`。

结果：Claude Code 立刻报 task `completed` (exit 0)，看起来 dev server 已退出。但 `ps -ef | grep next dev` 显示进程其实还活着，`ss -tlnp` 也能看到 port 在 listen。

## 原因

- `&` 让 npm run dev 进入子 shell 后台
- 父 shell 立刻执行 `echo` 然后退出（exit 0）
- Claude Code wrapper 看到父 shell 退出，认为"task completed"
- 但 OS 层面子进程并未被回收，继续运行（直到被 SIGHUP 或手动 kill）

**误报**："completed" 不代表 server 已退出，反过来也不能靠它来判断 server 已 ready。

## 正确做法

**让 wrapper 自己 detach，不要在命令里加 `&`：**

```bash
cd frontend && PORT=4000 npm run dev
```

配合 `run_in_background: true`。Claude 会在 server 真的退出（成功或失败）时给一次准确通知。

## 等待 ready 的写法

需要等"开始监听"信号时，单独跑一条 Bash：

```bash
until lsof -i :3000 | grep -q LISTEN; do sleep 1; done; echo ready
```

也用 `run_in_background: true`，它会在 listen 那一刻 exit 0 给一次通知。

## 触发场景

- 启动 dev server / backend / 任何 daemon
- 看到 "task completed exit 0" 但服务实际上还活着——别误以为它崩了，先 `ps`/`ss` 验证
