在go语言种获取进程ID后面的可执行文件名示例代码
Go  /  管理员 发布于 1年前   315
如果你想检查某个进程是否真的在运行,同时想找出与进程 ID 相关的应用程序
/可执行文件/二进制文件名。如何做到这一点?
解决方案:
我们将使用标准的 os 和 syscall 函数来确定进程是否正在运行。
要获取与进程 ID 关联的应用程序/可执行文件或二进制文件名,
我们将使用 Mitchell Hashimoto 的go-ps软件包
https://github.com/mitchellh/go-ps
要测试下面的程序,
请在 Linux/Unix 下使用 ps 命令或在 Windows 下使用任务管理器获取一些进程 ID。
注意:
你将无法查询某些进程,因为你不是进程的所有者。
示例代码:
package main
import (
"errors"
"fmt"
ps "github.com/mitchellh/go-ps"
"os"
"runtime"
"strconv"
"syscall"
)
// 检查进程是否真的在运行
// 然而,在 Unix 系统上,os.FindProcess 总是成功的,并返回
// 给定 pid 的进程......无论该进程是否存在
// 是否存在。
func getProcessRunningStatus(pid int) (*os.Process, error) {
proc, err := os.FindProcess(pid)
if err != nil {
return nil, err
}
//再次检查进程是否运行并存活
//通过发送信号 0
//注意:syscall.Signal 在 Windows 中不可用
err = proc.Signal(syscall.Signal(0))
if err == nil {
return proc, nil
}
if err == syscall.ESRCH {
return nil, errors.New("process not running")
}
// default
return nil, errors.New("进程正在运行,但不允许进行查询操作")
}
func main() {
if len(os.Args) != 2 {
// 将程序名称返回到 %s
fmt.Printf("Usage : %s processID \n ", os.Args[0])
//退出
os.Exit(1)
}
pid, err := strconv.Atoi(os.Args[1])
if err != nil {
fmt.Println("提供的进程 ID 不正确")
os.Exit(-1)
}
//注意:syscall.Signal 在 Windows 中不可用
if runtime.GOOS != "windows" {
_, err := getProcessRunningStatus(int(pid))
if err != nil {
fmt.Println("Error : ", err)
os.Exit(-1)
}
}
// 在这个阶段,Golang 的操作系统软件包中与 Processes 相关的函数
// 已经不够用了,我们将使用 Mitchell Hashimoto 的 https://github.com/mitchellh/go-ps
// 包来查找进程 ID 后面的应用程序/可执行文件/二进制文件名。
p, err := ps.FindProcess(pid)
if err != nil {
fmt.Println("Error : ", err)
os.Exit(-1)
}
fmt.Println("进程 ID : ", p.Pid())
fmt.Println("父进程 ID : ", p.PPid())
fmt.Println("进程 ID 二进制名称 : ", p.Executable())
}
Mac 上的输出示例
./checkprocess 387
进程 ID:387
父进程 ID:1
进程 ID 二进制名称:Google Drive
./checkprocess 392
进程 ID : 392
父进程 ID : 1
进程 ID 二进制名称 : Dropbox
./checkprocess 398
错误:进程正在运行,但不允许进行查询操作
Windows 上的输出示例:
C:\work>checkprocess 8112
进程 ID : 8112
父进程 ID:2944
进程 ID 二进制名称:cmd.exe
C:\work>checkprocess 3972
进程 ID : 3972
父进程 ID : 824
进程 ID 二进制名称 : chrome.exe
C:\work>checkprocess 8132
进程 ID : 8132
父进程 ID : 236
进程 ID 二进制名称: CCC.exe
相关链接:
https://golang.org/pkg/os/#FindProcess
https://github.com/mitchellh/go-ps/blob/master/process.go
123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号