golang 重启第三方推荐库使用方法
以下是两个常用的第三方库 github.com/mitchellh/go-ps 和 github.com/shirou/gopsutil/v3/process 的使用方法,帮助你实现跨平台的进程管理和重启操作。
1. 使用 github.com/mitchellh/go-ps 查找进程
安装
bash
go get github.com/mitchellh/go-ps
示例代码
go
package main import ( "fmt" "os" "os/exec" "time" "github.com/mitchellh/go-ps" ) func main() { // 目标应用程序的名称 targetApp := "target_app" // 替换为目标应用程序的名称 // 查找目标应用程序的进程ID pid, err := findPID(targetApp) if err != nil { fmt.Println("查找进程失败:", err) return } if pid > 0 { fmt.Printf("找到目标应用程序,PID: %d\n", pid) // 停止目标应用程序 if err := stopApp(pid); err != nil { fmt.Println("停止应用程序失败:", err) return } fmt.Printf("已停止进程,PID: %d\n", pid) } else { fmt.Println("目标应用程序未运行") } // 重启目标应用程序 if err := restartApp("./target_app"); err != nil { fmt.Println("重启失败:", err) } else { fmt.Println("重启成功") } } func findPID(appName string) (int, error) { processes, err := ps.Processes() if err != nil { return 0, err } for _, p := range processes { if p.Executable() == appName { return p.Pid(), nil } } return 0, nil // 未找到进程 } func stopApp(pid int) error { process, err := os.FindProcess(pid) if err != nil { return err } // 发送终止信号 if err := process.Signal(os.Interrupt); err != nil { return err } // 等待进程退出 time.Sleep(1 * time.Second) return nil } func restartApp(appPath string) error { cmd := exec.Command(appPath) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr cmd.Stdin = os.Stdin if err := cmd.Start(); err != nil { return err } fmt.Printf("应用程序已重启,新进程PID: %d\n", cmd.Process.Pid) return nil }
2. 使用 github.com/shirou/gopsutil/v3/process 查找和管理进程
安装
bash
go get github.com/shirou/gopsutil/v3/process
示例代码
go
package main import ( "fmt" "os" "os/exec" "time" "github.com/shirou/gopsutil/v3/process" ) func main() { // 目标应用程序的名称 targetApp := "target_app" // 替换为目标应用程序的名称 // 查找目标应用程序的进程ID pid, err := findPID(targetApp) if err != nil { fmt.Println("查找进程失败:", err) return } if pid > 0 { fmt.Printf("找到目标应用程序,PID: %d\n", pid) // 停止目标应用程序 if err := stopApp(pid); err != nil { fmt.Println("停止应用程序失败:", err) return } fmt.Printf("已停止进程,PID: %d\n", pid) } else { fmt.Println("目标应用程序未运行") } // 重启目标应用程序 if err := restartApp("./target_app"); err != nil { fmt.Println("重启失败:", err) } else { fmt.Println("重启成功") } } func findPID(appName string) (int, error) { processes, err := process.Processes() if err != nil { return 0, err } for _, p := range processes { name, err := p.Name() if err != nil { continue } if name == appName { return int(p.Pid), nil } } return 0, nil // 未找到进程 } func stopApp(pid int) error { p, err := process.NewProcess(int32(pid)) if err != nil { return err } // 发送终止信号 if err := p.Terminate(); err != nil { return err } // 等待进程退出 time.Sleep(1 * time.Second) return nil } func restartApp(appPath string) error { cmd := exec.Command(appPath) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr cmd.Stdin = os.Stdin if err := cmd.Start(); err != nil { return err } fmt.Printf("应用程序已重启,新进程PID: %d\n", cmd.Process.Pid) return nil }
对比两个库
特性 mitchellh/go-ps shirou/gopsutil/v3/process
功能 仅支持查找进程 支持查找、管理、监控进程
跨平台支持 是 是
易用性 简单 功能丰富,API 稍复杂
性能 轻量级 较重,但功能强大
适用场景 简单的进程查找 需要进程管理的复杂场景
总结
如果只需要简单的进程查找功能,推荐使用 mitchellh/go-ps。
如果需要更强大的进程管理功能(如终止进程、获取进程资源使用情况等),推荐使用 shirou/gopsutil/v3/process。
根据你的需求选择合适的库即可!