golang 重启第三方推荐库使用方法

作者: adm 分类: go 发布时间: 2024-10-13

以下是两个常用的第三方库 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。
根据你的需求选择合适的库即可!

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!