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。
根据你的需求选择合适的库即可!

