golang使用os/exec库查询进程

这篇具有很好参考价值的文章主要介绍了golang使用os/exec库查询进程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文主要介绍如何使用os/exec库查询进程。

package main

import (

    "fmt"

    "os/exec"

)

func main() {

    cmd := exec.Command("ps", "-ef")

    output, err := cmd.Output()

    if err != nil {

        fmt.Println(err)

        return

    }

    fmt.Println(string(output))

}

输出:

 go run process.go
  UID   PID  PPID   C STIME   TTY           TIME CMD
    0     1     0   0  1 170  ??       114:31.61 /sbin/launchd
    0   287     1   0  1 476  ??        21:22.98 /usr/libexec/logd
    0   288     1   0  1 476  ??         1:09.95 /usr/libexec/UserEventAgent (System)
    0   290     1   0  1 476  ??         0:23.88 /System/Library/PrivateFrameworks/Uninstall.framework/Resources/uninstalld
    0   291     1   0  1 476  ??        24:42.10 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/FSEvents.framework/Versions/A/Support/fseventsd
    0   292     1   0  1 476  ??        28:48.91 /Library/Application Support/Symantec/Silo/MES/Daemon/SymDaemon
    0   296     1   0  1 476  ??         1:01.12 /Library/PrivilegedHelperTools/AliCloudPrinterUpdater
    0   298     1   0  1 476  ??        57:11.04 /usr/sbin/systemstats --daemon
    0   300     1   0  1 476  ??        13:41.30 /usr/libexec/configd
    0   301     1   0  1 476  ??        14:46.12 /Library/Application Support/AntGroup/starpoint/Mobius
    0   303     1   0  1 476  ??         6:36.35 /System/Library/CoreServices/powerd.bundle/powerd
  501   304     1   0  1 476  ??         0:08.48 /Library/McAfee/agent/bin/macmnsvc self_start
    0   305     1   0  1 476  ??         1:48.76 /Library/McAfee/agent/bin/masvc self_start
    0   306     1   0  1 476  ??         0:00.01 /usr/libexec/IOMFB_bics_daemon
    0   309     1   0  1 476  ??         0:00.59 /usr/libexec/remoted
    0   317     1   0  1 476  ??         0:30.29 /usr/libexec/watchdogd
    0   321     1   0  1 476  ??        25:27.64 /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Support/mds
    0   323     1   0  1 476  ??         0:01.38 /usr/libexec/kernelmanagerd
    0   324     1   0  1 476  ??         0:43.61 /usr/libexec/diskarbitrationd
    0   330     1   0  1 476  ??         0:31.26 /usr/sbin/syslogd
    0   333     1   0  1 476  ??         1:51.28 /usr/libexec/thermalmonitord
    0   334     1   0  1 476  ??        27:10.87 /usr/libexec/opendirectoryd
    0   335     1   0  1 476  ??         1:15.07 /System/Library/PrivateFrameworks/ApplePushService.framework/apsd
    0   337     1   0  1 476  ??         0:01.15 /Library/PrivilegedHelperTools/com.docker.vmnetd
    0   338     1   0  1 476  ??         9:32.88 /System/Library/CoreServices/launchservicesd
  213   341     1   0  1 476  ??         0:01.83 /System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/Resources/usbmuxd -launchd
    0   342     1   0  1 476  ??         1:12.54 /usr/sbin/securityd -i
    0   343     1   0  1 476  ??         0:00.03 auditd -l

上述代码逻辑会获取到当前系统中所有运行的进程,但如果只需要获取制定进程信息呢,就需要针对进程进行过滤。

第一种方式:

package main



import (

    "fmt"

    "bytes"
    "os/exec"

)
func RunCmd(cmdstring string) (string, error) {
	var out bytes.Buffer
	var stderr bytes.Buffer
	cmd := exec.Command("/bin/sh", "-c", cmdstring)
	cmd.Stdout = &out
	cmd.Stderr = &stderr
	err := cmd.Run()
	if err != nil {
		fmt.Printf("err:%v\n",err)
		return fmt.Sprintf("%s",stderr.String()),err
	}
	return fmt.Sprintf("%v",out.String()),nil
}

func main() {
    cmd := fmt.Sprintf("ps -ef | grep '%v'| grep -v grep","/bin/zsh --login -i")
    result,err := RunCmd(cmd)
    if err != nil {
	fmt.Printf("run cmd:%v failed:%v\n",cmd,err)
	return
    }

    fmt.Println(result)

}

输出:

$ go run process.go
  502 45987 45915   0  8 623  ttys004    0:00.09 /bin/zsh --login -i
  502 76923 45915   0 13 623  ttys009    0:00.07 /bin/zsh --login -i
  502 39231 45915   0 三02下午 ttys012    0:00.08 /bin/zsh --login -i

第二种方式:

package main



import (

    "fmt"
    "strings"
    "bytes"
    "os/exec"

)
func RunCmd(cmdstring string) (string, error) {
	var out bytes.Buffer
	var stderr bytes.Buffer
	cmd := exec.Command("/bin/sh", "-c", cmdstring)
	cmd.Stdout = &out
	cmd.Stderr = &stderr
	err := cmd.Run()
	if err != nil {
		fmt.Printf("err:%v\n",err)
		return fmt.Sprintf("%s",stderr.String()),err
	}
	return fmt.Sprintf("%v",out.String()),nil
}

func main() {
    //cmd := fmt.Sprintf("ps -ef | grep '%v'| grep -v grep","/bin/zsh --login -i")
    cmd := fmt.Sprintf("ps -ef")
    result,err := RunCmd(cmd)
    if err != nil {
	fmt.Printf("run cmd:%v failed:%v\n",cmd,err)
	return
    }
    lines := strings.Split(result, "\n")
    for _, line := range lines {
        if strings.Contains(line, "/bin/zsh --login -i") {
            fmt.Println(line)
        }
    }
}

输出:文章来源地址https://www.toymoban.com/news/detail-506687.html

 $ go run process.go
  502 45987 45915   0  8 623  ttys004    0:00.09 /bin/zsh --login -i
  502 76923 45915   0 13 623  ttys009    0:00.07 /bin/zsh --login -i
  502 39231 45915   0 三02下午 ttys012    0:00.08 /bin/zsh --login -i

到了这里,关于golang使用os/exec库查询进程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GoLang:sql.Exec()报错

    Sorry, can not exec into mysql: Error 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ... sql.Exec 在大多数情况下只能执行单条SQL语句。如果您的SQL脚本包含多条语句,您需要将它们分割并逐一执行。这通常涉及将整个SQ

    2024年01月24日
    浏览(42)
  • lua中执行luci.sys.call、luci.sys.exec、os.execute的区别

    相同点:都是调用Linux底层脚本及程序 不同点: (1)luci.sys.call(command) 脾气捉摸不透,实际使用有些时候没有得到任何状态或数据返回,纯粹被用了一下。 (2)luci.sys.exec(command) 比较可靠,可以返回标准输出,比如 value = luci.sys.exec(command) 获取执行结果用作参量。 message =

    2024年02月13日
    浏览(59)
  • bug:golang通过exec.Command()执行命令报错

    需求描述:压缩某个目录下的所有文件 在执行过程中,发现zip命令可行,但是 /usr/bin/zip test.zip * 发现无法压缩成功,程序直接报错退出,后来排查返现是golang中的exec.Command()不支持 * 通配符,但是我们可以通过下面的方式实现效果。 将 * 替换为所有的文件名及目录:

    2024年02月13日
    浏览(35)
  • 进程的程序替换(exec函数)【Linux】

      进程的程序替换就是让子进程执行新程序, 执行全新的代码和数据,不再和父进程有瓜葛。 替换原理   用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程

    2024年02月02日
    浏览(47)
  • Python中os.environ基本介绍及使用方法

    os.environ简介 os.environ 是Python中的一个字典对象,它包含了当前进程的环境变量。通过使用 os.environ ,可以获取和设置环境变量的值。 下面是给给定的Python代码添加注释说明的示例 在上述代码中,我们首先导入了 os 模块,然后使用 os.environ.get() 方法获取名为 PATH 的环境变量的

    2024年04月12日
    浏览(42)
  • golang的os包用法简介

    Go语言的 os 包中提供了操作系统函数的接口,是一个比较重要的包。顾名思义,os 包的作用主要是在服务器上进行系统的基本操作,如文件操作、目录操作、执行命令、信号与中断、进程、系统状态等等。 Hostname 函数定义: Hostname 函数会返回内核提供的主机名。 Environ 函数定

    2024年02月03日
    浏览(31)
  • 将GPU版本的torch和torchvision下载至本地进行安装,解决torch.cuda.is_available()为False的情况,本文主要解决CPU版本的torch问题。

    这是困扰我很久的问题,今天花了一点时间去研究一下为什么我的cuda和cudann安装完成了,却不能使用GPU,原因是我的torch和torchvision是cpu版本的,必须下载GPU版本的才能使torch.cuda.is_available()为True,本文使用将文件下载到文件夹后进行安装。 1、打开Anaconda Prompt(Anaconda3)  2、打开

    2024年02月10日
    浏览(63)
  • os.signal golang中的信号处理

    在程序进行重启等操作时,我们需要让程序完成一些重要的任务之后,优雅地退出,Golang为我们提供了signal包,实现信号处理机制,允许Go 程序与传入的信号进行交互。 Go语言标准库中signal包的核心功能主要包含以下几个方面: 1. signal处理的全局状态管理 通过handlers结构体跟

    2024年02月15日
    浏览(51)
  • Windows如何查询软件使用的端口号?树莓派怎么查询怎么杀掉进程?

    目录 一、windows根据PID查看软件使用端口 二、封端口 三、树莓派查PID、杀掉进程 很多软件有后门,为了网络安全,需要查看某些软件的端口号,然后封锁他,以防止他做坏事! 另外,树莓派软件一直全屏无法关闭,需要使用命令行kill掉 win7为例 1、首先查看程序的PID号,打

    2024年02月07日
    浏览(52)
  • 2.OS-Virtualization|抽象:进程

    进程:运行中的程序。 没有运行前,就是一个代码,他是静态的。 通过一系列抽象,有了状态。 通过进程抽象,我们需要明白计算机设计的一些思考点:如何分离?如何管理?如何抽象? 运行 就绪 阻塞 它就是一个状态机,一系列无情的指令集。 而这种状态的不停切换,

    2024年02月03日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包