后台自动提交代码任务
· 3 min read
后台自动提交代码功能
背景
why?
忘记打卡了,需要的凭证就是提交代码才有效,于是有了这个需求,希望自动定时每天8点50提交一份代码。
需求分析
- 写一个程序可以提交代码并且push
- 定时执行
- 后台启动
具体实现
auto_commit.go
package main
import (
"fmt"
"os"
"os/exec"
"time"
)
func updateReadme() error {
// 切换到 gwx_test 分支
if err := exec.Command("git", "checkout", "gwx_test").Run(); err != nil {
return fmt.Errorf("切换分支失败: %v", err)
}
// 追加内容到 hello.txt
timestamp := time.Now().Format("2006-01-02 15:04:05")
content := fmt.Sprintf("\nAuto update at %s", timestamp)
f, err := os.OpenFile("hello.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
return fmt.Errorf("打开文件失败: %v", err)
}
defer f.Close()
if _, err := f.WriteString(content); err != nil {
return fmt.Errorf("写入文件失败: %v", err)
}
// 添加更改
if err := exec.Command("git", "add", ".").Run(); err != nil {
return fmt.Errorf("git add 失败: %v", err)
}
// 提交更改
if err := exec.Command("git", "commit", "-m", "Auto update time").Run(); err != nil {
return fmt.Errorf("git commit 失败: %v", err)
}
// 推送到远程
if err := exec.Command("git", "push", "upstream", "gwx_test").Run(); err != nil {
return fmt.Errorf("git push 失败: %v", err)
}
fmt.Printf("成功更新 at %s\n", timestamp)
return nil
}
func main() {
fmt.Println("自动提交任务已启动...")
// 添加 recover 机制
defer func() {
if r := recover(); r != nil {
fmt.Printf("程序发生严重错误: %v\n", r)
// 重新启动主循环
main()
}
}()
for {
now := time.Now()
next := time.Date(now.Year(), now.Month(), now.Day(), 8, 50, 0, 0, now.Location())
if now.After(next) {
next = next.Add(24 * time.Hour)
}
timer := time.NewTimer(next.Sub(now))
fmt.Printf("等待下一次执行,将在 %s 运行\n", next.Format("2006-01-02 15:04:05"))
<-timer.C
// 使用 recover 包装任务执行
func() {
defer func() {
if r := recover(); r != nil {
fmt.Printf("任务执行出错: %v\n", r)
}
}()
if err := updateReadme(); err != nil {
fmt.Printf("执行出错: %v\n", err)
}
}()
}
}
编译为可执行文件
go build -o auto_commit.exe auto_commit.go
后台运行
@echo off
echo 开始执行自动提交任务 %date% %time% >> auto_commit_log.txt
start /b auto_commit.exe
echo 任务已启动 %date% %time% >> auto_commit_log.txt
遇到的问题
没有使用定时触发器,导致cpu卡顿
1. 使用 time.NewTimer 创建定时器
2. 使用 <-timer.C 等待定时器触发,而不是持续循环
3. 移除了 time.Sleep
- CPU 使用率会大幅降低
- 程序仍然会在指定时间执行任务
- 定时器触发前程序会处于休眠状态
- 系统资源占用更少使用 time.Timer 来替代持续循环