fix: scheduler panic on nil execution result and enable verbose logging
This commit is contained in:
@@ -120,6 +120,7 @@ func NewAgent(config *Config, configFile string) *Agent {
|
|||||||
WorkerCount: runtime.NumCPU(),
|
WorkerCount: runtime.NumCPU(),
|
||||||
QueueSize: 100,
|
QueueSize: 100,
|
||||||
RateInterval: 100 * time.Millisecond,
|
RateInterval: 100 * time.Millisecond,
|
||||||
|
Verbose: true,
|
||||||
}
|
}
|
||||||
a.scheduler = executor.NewScheduler(schedCfg, handler)
|
a.scheduler = executor.NewScheduler(schedCfg, handler)
|
||||||
a.scheduler.SetLogger(logger.NewSchedulerLogger())
|
a.scheduler.SetLogger(logger.NewSchedulerLogger())
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"os"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
@@ -14,6 +15,7 @@ type SchedulerConfig struct {
|
|||||||
WorkerCount int // Worker 数量
|
WorkerCount int // Worker 数量
|
||||||
QueueSize int // 队列大小
|
QueueSize int // 队列大小
|
||||||
RateInterval time.Duration // 速率限制间隔
|
RateInterval time.Duration // 速率限制间隔
|
||||||
|
Verbose bool // 是否开启详细日志
|
||||||
}
|
}
|
||||||
|
|
||||||
// TaskType 任务类型
|
// TaskType 任务类型
|
||||||
@@ -273,6 +275,15 @@ func (s *Scheduler) executeTask(req *ExecutionRequest) (*ExecutionResult, error)
|
|||||||
|
|
||||||
s.logger.Infof("[Scheduler] 执行任务 %s (名称: %s, 类型: %s)", req.TaskID, req.Name, req.Type)
|
s.logger.Infof("[Scheduler] 执行任务 %s (名称: %s, 类型: %s)", req.TaskID, req.Name, req.Type)
|
||||||
|
|
||||||
|
if s.config.Verbose {
|
||||||
|
workDir := req.WorkDir
|
||||||
|
if workDir == "" {
|
||||||
|
workDir, _ = os.Getwd()
|
||||||
|
}
|
||||||
|
s.logger.Infof("[Scheduler] 任务 #%s 进程 UID: %d, GID: %d", req.TaskID, os.Getuid(), os.Getgid())
|
||||||
|
s.logger.Infof("[Scheduler] 任务 #%s 工作目录: %s", req.TaskID, workDir)
|
||||||
|
}
|
||||||
|
|
||||||
// 1. 执行前事件:获取 stdout/stderr 写入器
|
// 1. 执行前事件:获取 stdout/stderr 写入器
|
||||||
var stdout, stderr io.Writer
|
var stdout, stderr io.Writer
|
||||||
var err error
|
var err error
|
||||||
@@ -340,19 +351,31 @@ func (s *Scheduler) executeTask(req *ExecutionRequest) (*ExecutionResult, error)
|
|||||||
|
|
||||||
// 5. 构建结果
|
// 5. 构建结果
|
||||||
result := &ExecutionResult{
|
result := &ExecutionResult{
|
||||||
TaskID: req.TaskID,
|
TaskID: req.TaskID,
|
||||||
LogID: req.LogID, // 传递 LogID
|
LogID: req.LogID, // 传递 LogID
|
||||||
Success: execResult.Status == "success",
|
}
|
||||||
Output: stdoutBuf.String(),
|
|
||||||
Status: execResult.Status,
|
if execResult != nil {
|
||||||
Duration: execResult.Duration,
|
result.Success = execResult.Status == "success"
|
||||||
ExitCode: execResult.ExitCode,
|
result.Output = stdoutBuf.String()
|
||||||
StartTime: execResult.StartTime,
|
result.Status = execResult.Status
|
||||||
EndTime: execResult.EndTime,
|
result.Duration = execResult.Duration
|
||||||
|
result.ExitCode = execResult.ExitCode
|
||||||
|
result.StartTime = execResult.StartTime
|
||||||
|
result.EndTime = execResult.EndTime
|
||||||
|
} else {
|
||||||
|
result.Success = false
|
||||||
|
result.Status = "failed"
|
||||||
|
result.StartTime = start
|
||||||
|
result.EndTime = time.Now()
|
||||||
|
result.Duration = result.EndTime.Sub(result.StartTime).Milliseconds()
|
||||||
}
|
}
|
||||||
|
|
||||||
if execErr != nil {
|
if execErr != nil {
|
||||||
result.Error = execErr.Error()
|
result.Error = execErr.Error()
|
||||||
|
if result.Output == "" {
|
||||||
|
result.Output = execErr.Error()
|
||||||
|
}
|
||||||
errOutput := stderrBuf.String()
|
errOutput := stderrBuf.String()
|
||||||
if errOutput != "" {
|
if errOutput != "" {
|
||||||
result.Output += "\n[ERROR]\n" + errOutput
|
result.Output += "\n[ERROR]\n" + errOutput
|
||||||
|
|||||||
Reference in New Issue
Block a user