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

如何获取Flutter Web启动的Google Chrome进程ID并关闭浏览器?

解决Node.js启动Flutter Web后关闭Chrome浏览器的问题

问题核心

用spawn启动Flutter Web时,Chrome是Flutter Dart进程的子进程,但child.kill()仅终止父进程,不会联动关闭Chrome;通过--web-port杀进程失败,是因为Chrome实际连接的是Flutter启动的代理端口,而非你指定的49430。

可行解决方案

1. 启动时绑定Chrome与父进程生命周期

修改spawn调用方式,拆分命令参数,并给Chrome添加强制关联父进程的启动参数,这样父进程终止时Chrome会自动退出:

const { spawn } = require('child_process');
const child = spawn("flutter", [
  "run",
  "-d", "chrome",
  "--web-port=49430",
  "--web-browser-args=--disable-background-networking --no-sandbox",
  "main.dart"
]);

// 关闭时直接执行
child.kill();

Windows环境可去掉--no-sandbox参数。

2. 从Flutter输出提取Chrome进程ID

Flutter启动Chrome时会在控制台输出包含进程ID的日志,监听stdout捕获并提取:

const { spawn } = require('child_process');
const child = spawn("flutter", [
  "run",
  "-d", "chrome",
  "--web-port=49430",
  "main.dart"
]);

let chromePid = null;

child.stdout.on('data', (data) => {
  const output = data.toString();
  // 匹配Linux/macOS环境下Chrome的进程ID,Windows需调整正则
  const pidMatch = output.match(/chrome.*pid=(\d+)/);
  if (pidMatch) {
    chromePid = pidMatch[1];
  }
});

// 关闭逻辑
function closeAll() {
  if (chromePid) {
    // Windows下用process.kill(chromePid, 1)
    process.kill(chromePid, 'SIGTERM');
  }
  child.kill();
}

3. 通过进程树关联父PID杀Chrome

借助ps-node工具,查找以Flutter Dart进程(child.pid)为父进程的Chrome进程并终止:

const { spawn } = require('child_process');
const ps = require('ps-node'); // 先执行 npm install ps-node

const child = spawn("flutter", [
  "run",
  "-d", "chrome",
  "--web-port=49430",
  "main.dart"
]);

async function closeAll() {
  child.kill();
  ps.lookup({
    ppid: child.pid,
    command: process.platform === 'win32' ? 'chrome.exe' : 'chrome'
  }, (err, procs) => {
    if (err) throw err;
    procs.forEach(proc => proc.pid && process.kill(proc.pid));
  });
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 00:41:03