写在前面,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来完成学习,逐步完成代码编写。