在Golang中实现程序开机自启动,主要有以下几种方法,具体取决于操作系统:
Windows系统
-
注册表方式
将程序路径添加到注册表的启动项中:
package main
import (
"golang.org/x/sys/windows/registry"
"path/filepath"
"os"
)
func enableAutoStart() error {
exePath, _ := filepath.Abs(os.Args[0])
key, err := registry.OpenKey(registry.CURRENT_USER, `SOFTWARE\Microsoft\Windows\CurrentVersion\Run`, registry.SET_VALUE)
if err != nil {
return err
}
defer key.Close()
return key.SetStringValue("MyGoApp", exePath)
}
-
计划任务方式
使用github.com/rickyninja/go-utils/task库创建计划任务(需管理员权限)。
Linux系统(Systemd)
创建服务文件(如/etc/systemd/system/myapp.service):
[Unit]
Description=My Golang App
After=network.target
[Service]
ExecStart=/path/to/your/app
Restart=always
User=root
[Install]
WantedBy=multi-user.target
然后执行:
sudo systemctl enable myapp.service
macOS系统(Launchd)
创建plist文件(如~/Library/LaunchAgents/com.myapp.plist):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.myapp</string>
<key>ProgramArguments</key>
<array>
<string>/path/to/your/app</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
加载服务:
launchctl load ~/Library/LaunchAgents/com.myapp.plist
跨平台建议
- 使用第三方库如
github.com/kardianos/service简化操作:package main
import "github.com/kardianos/service"
type program struct{}
func (p *program) Start(s service.Service) error {
go p.run()
return nil
}
func (p *program) run() {
// 主程序逻辑
}
func main() {
svcConfig := &service.Config{
Name: "MyGoService",
DisplayName: "My Go Service",
Description: "This is a Go service.",
}
prg := &program{}
s, _ := service.New(prg, svcConfig)
s.Run()
}
注意事项
- 需处理权限问题(如Windows需管理员权限修改注册表)。
- 路径应使用绝对路径。
- 测试时先确保程序能正常手动运行。
选择适合你操作系统的方法即可实现开机自启。