# 监督进程与 Presence 文件

> 让浏览器生命周期跟随启动器进程或本地 presence 文件，也可改为通知而不退出。

Source: https://console.getchrovia.com/zh/docs/sdk-supervisor-process

**能力：**`supervisorProcess`。**启动参数：**`--supervisor-process-id` 和 `--supervisor-presence-file`。**EP：**`internal.supervisor_process.exit_browser_on_exit`。

## 选择监督信号

| 信号 | 支持平台 | 含义 |
| --- | --- | --- |
| `--supervisor-process-id=<pid>` | Windows、macOS | 观察运行中的外部进程 |
| `--supervisor-presence-file=<绝对路径>` | Windows、macOS、Linux | 观察本地文件是否持续存在 |

两个参数可以同时使用。例如启动器进程负责崩溃或退出监督，而删除 presence 文件可处理显式退出登录或撤销访问，无需退出启动器。

## 自动退出

默认在监督方结束后请求浏览器退出。以下 EP 明确设置该行为：

```json
{
  "internal": {
    "supervisor_process": {
      "exit_browser_on_exit": true
    }
  }
}
```

Windows/macOS 上的 Node.js 启动器可以将自己的 PID 传给浏览器。替换实际可执行文件和实例路径：

```js
import { spawn } from 'node:child_process';
const child = spawn('/absolute/path/to/browser', [
  '--user-data-dir=/absolute/path/to/profile',
  `--supervisor-process-id=${process.pid}`,
], { stdio: 'ignore' });
child.on('error', console.error);
```

保持启动器运行。这是外部启动器代码，不是 Provision Worker 脚本。`supervisorProcess` 授权自动退出；只有显式调用 JS `process.exit()` 才需要 `processManagement`。

## Presence 文件约定

启动浏览器**之前**在本地磁盘创建文件并关闭句柄。传入绝对路径；空路径、相对路径和包含 `..` 的路径无效。目录不算 presence 文件。删除、移走文件、将其变为目录、启动时文件缺失或监视失败，都会触发配置的监督方结束动作。修改内容不会撤销 presence。

浏览器不读取文件内容、不锁定文件，也不会重建文件。启动器负责在退出登录或撤销访问时删除。Windows 上保持句柄打开可能延迟实际删除。为保证变更通知可靠，应使用本地文件系统，不使用 SMB/NFS。

## 只通知，不退出

将 `exit_browser_on_exit` 设为 `false`，并授予 `messaging`。每次 Provision Worker 启动时注册：

```js
chrovia.messaging.on('chrovia.process.supervisor_exited', data => {
  console.log('Supervisor ended:', data);
});
```

PID 通知为 `{pid}`，文件通知为 `{path}`。缺少 messaging 时，非退出模式会记录警告且无法发送消息，不会自动回退为退出。

## 重要限制

授予能力并不强制要求这两个参数。两个参数都没有时不会启用监督功能。无效或无法打开的 PID 可能只记录日志并跳过监视，不要把 PID 参数当成失败时默认拒绝的启动器身份检查。文件路径无效或缺失时的行为更严格，但文件存在也不等于认证某个人或启动器。

分别测试启动器退出和文件删除。更改 EP 后需要重启，已签名配置还需重新签名。显式退出命令见[进程管理](https://console.getchrovia.com/zh/docs/sdk-process-management)，事件处理见[消息通信](https://console.getchrovia.com/zh/docs/sdk-messaging)。
