liubulong 发表于 2023-4-25 16:22:00

go语言开发求助

现在有个需求:
        想用go开发一个类似zbx-agent的插件,主要获取服务器资源信息,比如几个cpu,内存多少,硬盘多大,请问大佬这个该怎么写呢?

isdkz 发表于 2023-4-25 16:28:29

这个需求可以通过Go的一些第三方库和内置库来实现。这里给你一个简单的示例代码,以帮助你了解如何编写类似Zabbix Agent的插件,来获取服务器的CPU、内存和硬盘信息。

1. 安装必要的库:
go get github.com/shirou/gopsutil/cpu
go get github.com/shirou/gopsutil/mem
go get github.com/shirou/gopsutil/disk


2. 创建一个名为`main.go`的文件,并输入以下代码:

package main

import (
        "fmt"
        "github.com/shirou/gopsutil/cpu"
        "github.com/shirou/gopsutil/disk"
        "github.com/shirou/gopsutil/mem"
)

func main() {
        // 获取CPU信息
        cpuInfo, err := cpu.Info()
        if err != nil {
                fmt.Println("无法获取CPU信息:", err)
                return
        }

        // 获取内存信息
        memInfo, err := mem.VirtualMemory()
        if err != nil {
                fmt.Println("无法获取内存信息:", err)
                return
        }

        // 获取硬盘信息
        diskPartitions, err := disk.Partitions(true)
        if err != nil {
                fmt.Println("无法获取硬盘信息:", err)
                return
        }

        // 打印获取到的信息
        fmt.Println("CPU信息:")
        for _, info := range cpuInfo {
                fmt.Printf("型号: %v 核心数: %v\n", info.ModelName, info.Cores)
        }

        fmt.Println("\n内存信息:")
        fmt.Printf("总内存: %v MB 已使用内存: %v MB\n", memInfo.Total/1024/1024, memInfo.Used/1024/1024)

        fmt.Println("\n硬盘信息:")
        for _, partition := range diskPartitions {
                usage, _ := disk.Usage(partition.Mountpoint)
                fmt.Printf("设备: %v 容量: %v GB 已使用: %v GB\n", partition.Device, usage.Total/1024/1024/1024, usage.Used/1024/1024/1024)
        }
}


3. 运行代码:
go run main.go


以上示例代码将获取服务器的CPU、内存和硬盘信息,并打印出来。你可以根据需要对代码进行修改以满足你的需求。

注意:在使用`gopsutil`库时,某些操作可能需要管理员权限。在运行时可能需要使用`sudo`命令。

liubulong 发表于 2023-4-25 17:15:48

isdkz 发表于 2023-4-25 16:28
这个需求可以通过Go的一些第三方库和内置库来实现。这里给你一个简单的示例代码,以帮助你了解如何编写类似 ...

嗯,好的,谢谢大佬{:5_110:}

isdkz 发表于 2023-4-25 17:18:34

liubulong 发表于 2023-4-25 17:15
嗯,好的,谢谢大佬

不客气{:5_110:}

liubulong 发表于 2023-4-26 13:58:00

isdkz 发表于 2023-4-25 16:28
这个需求可以通过Go的一些第三方库和内置库来实现。这里给你一个简单的示例代码,以帮助你了解如何编写类似 ...

我想再问一下,那可以编译成一个安装包吗?类似zbx-agent的这样的程序,然后下发给每个服务器去执行,然后定时任务去跑这个程序,类似埋点,需要的时候去启动执行任务,不需要的时候就不运行。

isdkz 发表于 2023-4-26 14:31:51

liubulong 发表于 2023-4-26 13:58
我想再问一下,那可以编译成一个安装包吗?类似zbx-agent的这样的程序,然后下发给每个服务器去执行,然 ...

可以的,你可以将你的Go程序编译成一个可执行文件,然后将它部署到每个服务器上。对于定时任务,你可以使用服务器上的计划任务(如Linux的`cron`或Windows的任务计划程序)来实现。

1. 首先,你需要将你的Go程序编译成一个可执行文件。在项目的根目录下,运行以下命令:
go build -o agent

这将生成一个名为`agent`(在Windows系统中为`agent.exe`)的可执行文件。

2. 接下来,将这个可执行文件部署到服务器上。你可以通过SCP、FTP等方式将文件传输到目标服务器。

3. 配置定时任务。以下是在Linux和Windows上设置定时任务的方法:

- 对于Linux(使用`cron`):
1. 在目标服务器上,使用`crontab -e`命令打开当前用户的计划任务列表。
2. 添加一行如下所示的定时任务(此示例每5分钟运行一次程序,你可以根据需求调整时间间隔):
*/5 * * * * /path/to/your/agent

3. 保存并退出编辑器,`cron`将自动加载更改。

- 对于Windows(使用任务计划程序):
1. 打开“任务计划程序”。
2. 选择“创建基本任务”并按照向导进行操作。设置任务的名称和描述,触发器选择“按计划”,然后设置任务的运行时间和重复间隔。
3. 在“操作”部分,选择“启动程序”,然后浏览到你的可执行文件的路径。
4. 完成向导,你的任务将按计划运行。

如此一来,你的Go程序将作为一个定时任务在服务器上运行。当然,你可以根据自己的需求调整定时任务的运行频率。根据需要启动或停止任务,只需在计划任务管理器中启用或禁用相应的任务即可。

liubulong 发表于 2023-4-26 16:32:29

isdkz 发表于 2023-4-26 14:31
可以的,你可以将你的Go程序编译成一个可执行文件,然后将它部署到每个服务器上。对于定时任务,你可以使 ...

嗯,好的,谢谢,我去测试一下看看

liubulong 发表于 2023-4-26 16:44:16

isdkz 发表于 2023-4-25 16:28
这个需求可以通过Go的一些第三方库和内置库来实现。这里给你一个简单的示例代码,以帮助你了解如何编写类似 ...

在执行这几个命令的时候报错了,麻烦帮忙解答一下,谢谢
执行如下:
go get github.com/shirou/gopsutil/cpu
go get github.com/shirou/gopsutil/mem
go get github.com/shirou/gopsutil/disk

报错信息如下:
# go get github.com/shirou/gopsutil/cpu
go: go.mod file not found in current directory or any parent directory.
        'go get' is no longer supported outside a module.
        To build and install a command, use 'go install' with a version,
        like 'go install example.com/cmd@latest'
        For more information, see https://golang.org/doc/go-get-install-deprecation
        or run 'go help get' or 'go help install'.
# go get github.com/shirou/gopsutil/mem
go: go.mod file not found in current directory or any parent directory.
        'go get' is no longer supported outside a module.
        To build and install a command, use 'go install' with a version,
        like 'go install example.com/cmd@latest'
        For more information, see https://golang.org/doc/go-get-install-deprecation
        or run 'go help get' or 'go help install'.
# go get github.com/shirou/gopsutil/disk
go: go.mod file not found in current directory or any parent directory.
        'go get' is no longer supported outside a module.
        To build and install a command, use 'go install' with a version,
        like 'go install example.com/cmd@latest'
        For more information, see https://golang.org/doc/go-get-install-deprecation
        or run 'go help get' or 'go help install'.
# go install github.com/shirou/gopsutil/cpu
go: 'go install' requires a version when current directory is not in a module
        Try 'go install github.com/shirou/gopsutil/cpu@latest' to install the latest version

isdkz 发表于 2023-4-26 16:55:27

liubulong 发表于 2023-4-26 16:44
在执行这几个命令的时候报错了,麻烦帮忙解答一下,谢谢
执行如下:
go get github.com/shirou/gopsuti ...

从错误信息来看,你在执行这些命令时不在Go模块的目录中。从Go 1.16开始,Go推荐使用Go模块来管理项目的依赖关系。请按照以下步骤操作:

1. 在你的项目目录中初始化一个新的Go模块:

go mod init <module-name>


将`<module-name>`替换为你想要的模块名称,通常是你的项目在代码仓库的导入路径,如`github.com/yourusername/yourprojectname`。

2. 然后在项目的根目录下执行以下命令来安装依赖:

go get github.com/shirou/gopsutil@v3.21.12


这将在你的`go.mod`文件中添加`gopsutil`库作为依赖项。现在,你可以使用以下`import`语句在`main.go`中导入`gopsutil`的子包:

import (
        "github.com/shirou/gopsutil/v3/cpu"
        "github.com/shirou/gopsutil/v3/mem"
        "github.com/shirou/gopsutil/v3/disk"
)


注意:根据你使用的Go版本和`gopsutil`库的版本,导入路径可能略有不同。请根据实际情况调整。在本示例中,我们使用的是`gopsutil` v3.21.12版本。
页: [1]
查看完整版本: go语言开发求助