如何获取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
相关产品推荐
相关产品推荐

