写在前面,ChatGPT的出现带了程序猿的变革,能减轻程序猿的很多工作,这里记录一下使用GPT来写一个watchdog进程监控的过程。

首先我提问了GPT一个问题,让给写一个简单示例:

请使用go来编写一个watchdog 实现一下功能:1. 通过配置文件启动制定进程名称 2.监控进程是否在运行,如果不在运行则启动

答:

package main

import (
    "fmt"
    "os"
    "os/exec"
    "time"
)

func main() {
    // 读取配置文件
    config := map[string]string{
        "process_name": "your_program_name",
    }

    for {
        // 检查进程是否在运行
        cmd := exec.Command("pgrep", config["process_name"])
        if err := cmd.Run(); err != nil {
            fmt.Printf("%v is not running, starting it now...\n", config["process_name"])
            // 启动进程
            cmd = exec.Command("./your_program")
            if err := cmd.Start(); err != nil {
                fmt.Printf("Error starting %v: %v\n", config["process_name"], err)
                os.Exit(1)
            }
        } else {
            fmt.Printf("%v is running\n", config["process_name"])
        }
        // 每隔10秒检查一次
        time.Sleep(10 * time.Second)
    }
}

很快gpt给了回应,可以对一个进程进行是否在运行进行了检测。

那么问题来了这个仅仅只是个边角料,怎么进一步让gpt来帮我们完善代码呢? 这就要你一步步来进行提问了。

能看到上述代码是把进程名写死在文件中的,做不到灵活检测,我就让gpt给写了一个读取yaml配置文件的示例:

它给出了格式如下:

process_name: your_program_name
program_path: /path/to/your_program
sleep_duration: 10s

同时也给出了读写示例:

package main

import (
	"fmt"
	"io/ioutil"
	"os"
	"os/exec"
	"time"

	"gopkg.in/yaml.v2"
)

type Config struct {
	ProcessName   string `yaml:"process_name"`
	ProgramPath   string `yaml:"program_path"`
	SleepDuration string `yaml:"sleep_duration"`
}

func main() {
	// 读取配置文件
	config, err := readConfig("config.yaml")
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

	for {
		// 检查进程是否在运行
		cmd := exec.Command("pgrep", config.ProcessName)
		if err := cmd.Run(); err != nil {
			fmt.Printf("%v is not running, starting it now...\n", config.ProcessName)
			// 启动进程
			cmd = exec.Command(config.ProgramPath)
			if err := cmd.Start(); err != nil {
				fmt.Printf("Error starting %v: %v\n", config.ProcessName, err)
				os.Exit(1)
			}
		} else {
			fmt.Printf("%v is running\n", config.ProcessName)
		}
		// 每隔一定的时间间隔检查进程是否在运行
		duration, err := time.ParseDuration(config.SleepDuration)
		if err != nil {
			fmt.Printf("Invalid duration format %v: %v\n", config.SleepDuration, err)
			os.Exit(1)
		}
		time.Sleep(duration)
	}
}

func readConfig(filename string) (*Config, error) {
	// 读取配置文件
	data, err := ioutil.ReadFile(filename)
	if err != nil {
		return nil, err
	}
	// 解析配置文件
	config := &Config{}
	if err := yaml.Unmarshal(data, config); err != nil {
		return nil, err
	}
	return config, nil
}

依然不够完美,既然是进程狗监控,那么肯定不能只检测一个进程咯,我又让gpt给写了一个多进程检测示例:

配置文件为:

processes:
  - name: process1
    path: /path/to/your_program1
  - name: process2
    path: /path/to/your_program2
  - name: process3
    path: /path/to/your_program3
sleep_duration: 10s

示例程序:

package main

import (
	"fmt"
	"io/ioutil"
	"os"
	"os/exec"
	"time"

	"gopkg.in/yaml.v2"
)

type Process struct {
	Name string `yaml:"name"`
	Path string `yaml:"path"`
}

type Config struct {
	Processes     []*Process `yaml:"processes"`
	SleepDuration string     `yaml:"sleep_duration"`
}

func main() {
	// 读取配置文件
	config, err := readConfig("config.yaml")
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

	for {
		for _, process := range config.Processes {
			// 检查进程是否在运行
			cmd := exec.Command("pgrep", process.Name)
			if err := cmd.Run(); err != nil {
				fmt.Printf("%v is not running, starting it now...\n", process.Name)
				// 启动进程
				cmd = exec.Command(process.Path)
				if err := cmd.Start(); err != nil {
					fmt.Printf("Error starting %v: %v\n", process.Name, err)
					os.Exit(1)
				}
			} else {
				fmt.Printf("%v is running\n", process.Name)
			}
		}
		// 每隔一定的时间间隔检查进程是否在运行
		duration, err := time.ParseDuration(config.SleepDuration)
		if err != nil {
			fmt.Printf("Invalid duration format %v: %v\n", config.SleepDuration, err)
			os.Exit(1)
		}
		time.Sleep(duration)
	}
}

func readConfig(filename string) (*Config, error) {
	// 读取配置文件
	data, err := ioutil.ReadFile(filename)
	if err != nil {
		return nil, err
	}
	// 解析配置文件
	config := &Config{}
	if err := yaml.Unmarshal(data, config); err != nil {
		return nil, err
	}
	return config, nil
}

到这里基本上一个软件狗的样子就出来了。

个人总结:

不能期望gpt一次性帮你把代码写出来,需要逐步引导gpt来完成学习,逐步完成代码编写。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: ChatGPT