Node.js中如何隐藏execSync执行netstat时的控制台错误输出
问题
我使用以下代码判断端口是否被监听:
export var portIsListened = (port: number) => { try { return execSync(`netstat -tlnp | grep ${port}`).toString() != "" } catch (e) { return false } }
调用portIsListened(6000)时,明明端口未被监听,我期望仅返回false,但控制台总会输出以下错误信息,请问如何隐藏该输出?
(无法识别所有进程,无法显示非当前用户所属的进程信息,需要以root身份才能查看全部内容。)
解决方法
这个错误是netstat输出的标准错误(stderr)内容,execSync默认会将子进程的stderr转发到当前进程的控制台,所以会显示这条提示。可以通过两种方式隐藏:
方式一:Shell重定向stderr到/dev/null
在netstat命令后加上2>/dev/null直接丢弃标准错误输出,同时建议加上grep -v grep避免匹配到grep自身进程,防止误判:
import { execSync } from 'child_process'; export const portIsListened = (port: number) => { try { const output = execSync(`netstat -tlnp 2>/dev/null | grep -v grep | grep ${port}`).toString().trim(); return output !== ""; } catch (e) { return false; } };
方式二:通过execSync的配置项忽略stderr
利用execSync的stdio参数,设置忽略stderr:
import { execSync } from 'child_process'; export const portIsListened = (port: number) => { try { const output = execSync(`netstat -tlnp | grep -v grep | grep ${port}`, { stdio: ['ignore', 'pipe', 'ignore'] // 忽略输入,捕获标准输出,忽略标准错误 }).toString().trim(); return output !== ""; } catch (e) { return false; } };
补充说明
grep -v grep的作用是过滤掉grep ${port}这个临时进程的匹配结果,避免因为这个进程的存在错误判定端口被监听- 两种方法都能有效隐藏那根权限提示,选择哪种取决于你更倾向于通过shell处理还是Node.js子进程配置
内容的提问来源于stack exchange,提问作者chikadance
相关产品推荐
相关产品推荐

