如何结束node子进程
# 0.前言
# 1.终端终止方案:
windows
如果终端是
cmd
netstat -ano | findstr:3000 tskill PID
1
2如果是终端是
git bash
netstat -ano | findstr:3000 taskkill PID
1
2Linux/Mac OS
lsof -i tcp:3000 kill -9 PID
1
2
# 2.使用Node
结束子进程
直接现有库:
npx kill-port
1改库逻辑很简单,见 GitHub 源码 (opens new window)
实现一个完整的库还需要注意:
使用
shell-exec
打开shell
对平台的检测,如:
if(prossess.platform == "xxx"); // 主流支持的平台有: // win32 // darwin // linux
1
2
3
4
5
自己实现
封装函数:判断端口是否被占用。
如果被占用了,则用正则返回
PID
,关闭端口。function isPortOccupied(port: string | number) { return new Promise((resolve, reject) => { cp.exec(`lsof -i tcp:${port}`, { cwd: rootPath }, (_err, stdout) => { if (stdout.length > 0) { let regRex = new RegExp(/(?<=node\s+)[0-9]+/); let pid = stdout.match(regRex)?.[0] resolve(pid); } else { resolve(false); } }) }) }
1
2
3
4
5
6
7
8
9
10
11
12
13使用案例:使用
http-server
启动本地静态服务器async function startHttpServer(port: string | number, relativePath: string) { let pid = await isPortOccupied(port); if (!pid) { let _process = cp.exec(`http-server -p ${port}`, { cwd: rootPath }); _process.stdout?.on("data", (data: any) => { if (!data) return; if (data.includes("Available on:")) { console.log("3000端口启动成功"); vscode.commands.executeCommand("open-html-in-vscode.openweb", relativePath) } }) } else { console.log(`${port}端口已被占用`); cp.exec(`kill -9 ${pid}`, (_err) => { if (!_err) { console.log(`释放${port}端口号成功`); startHttpServer(port, relativePath); } }) } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 3. 注意点
在编写的时候遇到了一个坑点,简单记录下:
开启子进程
(child_process)
,需要判断进程是否被终止。子进程执行结束后关闭
使用
Node
风格回调即可。cp.exec("http-server --version",(_err,stdout,stderr)=>{xxxx})
1如果需要持续运行在后端,需使用
流式
监听的方式去处理数据Ps:这里一直有个疑问,很多教程中说
child_process
只有spawn
支持stream
操作,但是下面这种写法也是可行的。let process = cp.exec("xxx") process.stdout.on("data",(data:any)=>{}); process.stderr.on("data",(data:any)=>{});
1
2
3
4
使用
cp.exec
经常会遇到:没有任何信息的报错。这一点,在
stackoverflow
有很多提问提到这一点。最终解决方法,补全
option
操作。// 由于做的是 `VSCode` 插件,通过以下方式获取 workspace let rootPath = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath || ""; cp.exec("xxx",{cwd:rootPath},(err,stdout,stderr)=>{})
1
2
3
# 4.参考文章
编辑 (opens new window)
上次更新: 2022/10/07, 11:10:00