- 全局替换 ApiKey → APIKey(类型、字段、方法、变量) - 修复所有 initialism 命名(API, SMTP, HTML, URL 等) - 添加所有缺失的包注释 - 修复导出符号的注释格式 主要修改: - ApiKey → APIKey(所有出现的地方) - ApiKeyID → APIKeyID - ApiKeyIDs → APIKeyIDs - TestSmtpConnection → TestSMTPConnection - HtmlURL → HTMLURL - 添加 20+ 个包注释 - 修复 10+ 个导出符号注释格式 验证结果: - ✓ golangci-lint: 0 issues - ✓ 单元测试: 通过 - ✓ 集成测试: 通过
49 lines
1.4 KiB
Go
49 lines
1.4 KiB
Go
// Package sysutil provides system-level utilities for process management.
|
|
package sysutil
|
|
|
|
import (
|
|
"log"
|
|
"os"
|
|
"runtime"
|
|
"time"
|
|
)
|
|
|
|
// RestartService triggers a service restart by gracefully exiting.
|
|
//
|
|
// This relies on systemd's Restart=always configuration to automatically
|
|
// restart the service after it exits. This is the industry-standard approach:
|
|
// - Simple and reliable
|
|
// - No sudo permissions needed
|
|
// - No complex process management
|
|
// - Leverages systemd's native restart capability
|
|
//
|
|
// Prerequisites:
|
|
// - Linux OS with systemd
|
|
// - Service configured with Restart=always in systemd unit file
|
|
func RestartService() error {
|
|
if runtime.GOOS != "linux" {
|
|
log.Println("Service restart via exit only works on Linux with systemd")
|
|
return nil
|
|
}
|
|
|
|
log.Println("Initiating service restart by graceful exit...")
|
|
log.Println("systemd will automatically restart the service (Restart=always)")
|
|
|
|
// Give a moment for logs to flush and response to be sent
|
|
go func() {
|
|
time.Sleep(100 * time.Millisecond)
|
|
os.Exit(0)
|
|
}()
|
|
|
|
return nil
|
|
}
|
|
|
|
// RestartServiceAsync is a fire-and-forget version of RestartService.
|
|
// It logs errors instead of returning them, suitable for goroutine usage.
|
|
func RestartServiceAsync() {
|
|
if err := RestartService(); err != nil {
|
|
log.Printf("Service restart failed: %v", err)
|
|
log.Println("Please restart the service manually: sudo systemctl restart sub2api")
|
|
}
|
|
}
|