以下是一个简单的 golang 进程守护脚本示例,使用了 os/exec 包来启动和杀死进程。
package main
import (
"fmt"
"os"
"os/exec"
)
func main() {
cmd := exec.Command("./myprogram")
if err := cmd.Start(); err != nil {
fmt.Println("Error starting program:", err)
os.Exit(1)
}
fmt.Println("Program started. PID:", cmd.Process.Pid)
done := make(chan error, 1)
go func() {
done <- cmd.Wait()
}()
for {
select {
case err := <-done:
if err != nil {
fmt.Println("Program exited with error:", err)
} else {
fmt.Println("Program exited successfully.")
}
// 如果程序退出,则重新启动
fmt.Println("Restarting program...")
// 杀死进程
if cmd.Process != nil {
if err := cmd.Process.Kill(); err != nil {
fmt.Println("Error killing process:", err)
}
}
// 启动新进程
newCmd := exec.Command("./myprogram")
if err := newCmd.Start(); err != nil {
fmt.Println("Error starting program:", err)
os.Exit(1)
}
fmt.Println("New program started. PID:", newCmd.Process.Pid)
// 更新当前进程对象为新的进程对象
cmd = newCmd
// 重置 done channel,以便监控新的进程
done = make(chan error, 1)
go func() {
done <- cmd.Wait()
}()
default:
// 没有错误发生,继续监控进程
}
}
}
该脚本启动一个名为 myprogram 的程序,并在其退出时重新启动它。此脚本可以通过将其编译为可执行文件并使用操作系统的服务管理工具(例如 systemd 或 supervisor)来实现长时间运行和自动重启。




