本篇将介绍如何在程序终止后获取有关子进程的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
结构体才可用。