首页 游戏 软件 资讯 排行榜 专题
首页
编程语言
GOLang判断进程是否存在实现方式

GOLang判断进程是否存在实现方式

热心网友
11
转载
2026-04-27

GOLang判断进程是否存在

最近在琢磨用Go写一个进程检测工具,发现事情没那么简单。Go的标准库里,并没有提供一个现成的、直接获取系统进程列表的“银弹”方法。这可能是出于跨平台复杂性的考虑。怎么办呢?经过一番搜索和尝试,发现一个绕不开的路径:调用系统命令。没错,就是通过执行外部命令来获取我们需要的信息,这虽然绕了点路,但在Windows环境下却相当有效。

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

具体思路是这样的:我们可以借助Windows自带的WMIC(Windows Management Instrumentation Command-line)工具来获取所有进程的详细信息,然后再用查找命令来筛选我们关心的目标。下图清晰地展示了这个实现方式的逻辑流程:

GOLang判断进程是否存在实现方式

关键代码

基于上述思路,一个最直接的实现版本如下。这个例子以检测“chrome.exe”是否运行为目标:

    buf := bytes.Buffer{}
    cmd := exec.Command("wmic", "process", "get", "name,executablepath")
    cmd.Stdout = &buf
    cmd.Run()
    cmd2 := exec.Command("findstr", "chrome.exe")
    cmd2.Stdin = &buf
    data,  := cmd2.CombinedOutput()
    if len(data) == 0 {
        fmt.Println("not runing")
    } else {
        fmt.Println("runing")
    }

这段代码逻辑清晰:先通过wmic命令抓取进程列表输出到一个缓冲区,再让findstr命令从这个缓冲区里搜索特定关键词。如果搜索返回结果为空,就认为进程不存在;反之则存在。

不过,仔细推敲一下,这个基础版本有几个可以优化的地方。比如,错误处理不够完善;再比如,搜索关键词“chrome.exe”可能匹配到其他包含该字符串的进程路径,导致误判。这就需要我们进行更精细化的处理。

优化后的代码

为了让工具更健壮、更通用,我们对代码进行了重构。核心思想是将功能封装成一个函数,并引入双重验证机制:

// IsExeRuning : 程序是否运行,strKey:用于结果查找, strExeName:校验查找的是否是要寻找的进程
func IsExeRuning(strKey string, strExeName string) bool {
    buf := bytes.Buffer{}
    cmd := exec.Command("wmic", "process", "get", "name,executablepath")
    cmd.Stdout = &buf
    cmd.Run()
    cmd2 := exec.Command("findstr", strKey)
    cmd2.Stdin = &buf
    data, err := cmd2.CombinedOutput()
    if err != nil && err.Error() != "exit status 1" {
        //XBLog.LogF("ServerMonitor", "IsExeRuning CombinedOutput error, err:%s", err.Error())
        return false
    }
    strData := string(data)
    if strings.Contains(strData, strExeName) {
        return true
    } else {
        return false
    }
}

这个优化版本做了两处关键改进:

首先,增强了错误处理findstr命令在找不到匹配项时会返回退出状态码1,这属于正常情况,不应被视为错误。因此,代码特别排除了这种状态,只有当发生其他类型的错误时才返回失败。

其次,也是更重要的一点,引入了进程名精确校验。函数接受两个参数:strKey用于初步的快速查找(比如“chrome”),strExeName用于精确匹配(必须是“chrome.exe”)。这样设计的好处是,即使strKey匹配到了类似“chromedriver.exe”的进程,在最终的字符串包含检查中也会因为名称不精确而被过滤掉,从而大大提高了判断的准确性。

总结

总的来说,在Go语言中判断进程是否存在,尤其是在Windows平台下,通过组合系统命令是一种行之有效的方案。从基础命令调用到封装优化,整个过程的关键在于处理好命令执行的细节和结果的精确匹配。上面提供的思路和代码,希望能为有类似需求的开发者提供一个可靠的参考起点。

您可能感兴趣的文章:

  • golang 设置进程退出时kill所有子进程的三种方法
  • Golang仿ps实现获取Linux进程信息
  • 源码剖析Golang如何fork一个进程
  • Golang守护进程用法示例分析
  • golang进程内存控制避免docker内oom
  • golang进程在docker中OOM后hang住问题解析
  • golang 后台进程的启动和停止操作
来源:https://www.jb51.net/jiaoben/3629009nz.htm
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

golang进程启动及监控方式
编程语言
golang进程启动及监控方式

Golang进程启动及监控 在构建需要长期稳定运行的后台服务时,尤其是像边缘智能程序这类场景,进程的可靠性和自愈能力至关重要。今天,我们就来深入探讨两种在Go语言中实现进程守护与监控的实用方案。 守护进程(Daemon):核心目标是将目标进程与终端解耦,使其能在后激进分子立、稳定地运行。 监控进程(

热心网友
04.27
GOLang判断进程是否存在实现方式
编程语言
GOLang判断进程是否存在实现方式

GOLang判断进程是否存在 最近在琢磨用Go写一个进程检测工具,发现事情没那么简单。Go的标准库里,并没有提供一个现成的、直接获取系统进程列表的“银弹”方法。这可能是出于跨平台复杂性的考虑。怎么办呢?经过一番搜索和尝试,发现一个绕不开的路径:调用系统命令。没错,就是通过执行外部命令来获取我们需要的

热心网友
04.27

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

我国刀具市场发展调研报告
办公文书
我国刀具市场发展调研报告

我国刀具市场发展调研报告 在当今制造业持续升级的背景下,市场调研报告的重要性日益凸显。一份结构清晰、数据翔实的报告,能为决策提供关键参考。以下这份关于我国刀具市场的调研报告,旨在梳理现状、剖析问题,并为未来发展提供借鉴。 当前,国内刀具年销售额约为145亿元,其中硬质合金刀具占比不足25%。这一比例

热心网友
04.27
国内首份空净市场调研报告
办公文书
国内首份空净市场调研报告

国内首份空净市场调研报告 在公众健康意识日益增强的今天,市场报告的重要性不言而喻。一份结构清晰、数据翔实的报告,能为行业描绘出精准的航图。那么,一份优秀的市场调研报告究竟该如何呈现?近期发布的这份国内空气净化器行业蓝皮书,或许能提供一个范本。 市场增长的势头有多强劲?数据显示,国内空气净化器市场正驶

热心网友
04.27
水利工程供水管理调研报告
办公文书
水利工程供水管理调研报告

水利工程供水管理调研报告 在各类报告日益成为工作常态的今天,撰写一份扎实的调研报告,关键在于厘清现状、找准问题、提出思路。这份关于水利工程供水管理的报告,旨在系统梳理情况,为后续决策提供参考。 一、基本情况 横跨区域的**水库及八座枢纽拦河闸,构成了**运河流域防洪与兴利供水的骨干工程体系。自投入运

热心网友
04.27
财产保全申请书范本
办公文书
财产保全申请书范本

财产保全申请书范本 一份规范的财产保全申请书,是启动财产保全程序的关键文书。其核心在于清晰、准确地列明各方信息、诉求与依据。通常,申请书的结构是固定的,但具体内容需要根据案件事实来填充。下面,我们通过几个典型的范本来拆解其中的要点。 篇一:通用格式范本 首先来看一个通用模板。这个模板清晰地勾勒出了申

热心网友
04.27
暑假大学生防台风社会实践调研报告范文
办公文书
暑假大学生防台风社会实践调研报告范文

“防台抗台”活动由学院的积极分子组成,他们踊跃报名,利用暑期时间奉献自己的青春,为社会尽一份力量。 带队的学院分团委书记吕老师点出了活动的深层价值:这不仅是一次能力锻炼,更是学生认识社会、融入社会并最终回馈社会的关键一步。经过这番历练,团队友谊愈发坚固,协作精神显著增强,感恩之心也油然而生。 青春洋

热心网友
04.27