go基础库之获取子进程信息

本篇将介绍如何在程序终止后获取有关子进程的PID和基本信息。

有关正在运行的进程信息只能通过syscall包获取,并且与平台高度相关。

获取子进程信息

Golang 版本

1.12.1

前言

本篇将介绍如何在程序终止后获取有关子进程的PID和基本信息。

有关正在运行的进程信息只能通过syscall包获取,并且与平台高度相关。

实现

创建文件main_running.go,代码如下:

package main

import (
	"fmt"
	"os/exec"
	"runtime"
)

func main() {
	var cmd string
	if runtime.GOOS == "windows" {
		cmd = "timeout"
	} else {
		cmd = "sleep"
	}
	proc := exec.Command(cmd, "1")
	proc.Start()

	// 在进程结束之前不会返回任何进程状态
	fmt.Printf("运行进程的进程状态:%v\n", proc.ProcessState)

	// 获取正在运行进程的PID
	fmt.Printf("运行进程的PID:%d\n\n", proc.Process.Pid)
}

$ go run main_running.go
运行进程的进程状态:<nil>
运行进程的PID:45

创建文件main.go,代码如下:

package main

import (
	"fmt"
	"os/exec"
	"runtime"
	"time"
)

func main() {

	var cmd string
	if runtime.GOOS == "windows" {
		cmd = "timeout"
	} else {
		cmd = "sleep"
	}

	proc := exec.Command(cmd, "1")
	proc.Start()

	// Wait功能将等待,直到进程结束
	proc.Wait()

	// 在进程终止后,*os.ProcessState 包含有关进程运行的简单信息
	fmt.Printf("PID: %d\n", proc.ProcessState.Pid())
	fmt.Printf("进程耗费时间: %dms\n",
		proc.ProcessState.SystemTime()/time.Microsecond)
	fmt.Printf("成功退出: %t\n",
		proc.ProcessState.Success())

}
$ go run main.go
PID: 51
进程耗费时间: 15625ms
成功退出: true

原理

os/exec标准库提供了执行进程的方法。使用Command,返回Cmd结构体。Cmd提供了处理表示的访问权。当进程运行时,只能找到PID。

关于这个进程,只能获取到很少的信息。但是通过获取到的进程PID,还可以通过系统方法来获取更多信息。

请记住,即使子进程正在运行,也可以获得它的PID。另一方面,只有在进程终止之后,os包的ProcessState结构体才可用。