KillTask 终止任务
(taskID string, signal string, timeout int)
| 261 | |
| 262 | // KillTask 终止任务 |
| 263 | func (tm *FileTaskManager) KillTask(taskID string, signal string, timeout int) error { |
| 264 | tm.mu.Lock() |
| 265 | defer tm.mu.Unlock() |
| 266 | |
| 267 | task, exists := tm.tasks[taskID] |
| 268 | if !exists { |
| 269 | return fmt.Errorf("task not found: %s", taskID) |
| 270 | } |
| 271 | |
| 272 | if task.Status != "running" { |
| 273 | return fmt.Errorf("task is not running: %s", taskID) |
| 274 | } |
| 275 | |
| 276 | // 获取信号编号 |
| 277 | signalNum := tm.getSignalNumber(signal) |
| 278 | |
| 279 | // 发送信号 |
| 280 | proc, err := os.FindProcess(task.PID) |
| 281 | if err != nil { |
| 282 | return fmt.Errorf("failed to find process %d: %w", task.PID, err) |
| 283 | } |
| 284 | |
| 285 | err = proc.Signal(syscall.Signal(signalNum)) |
| 286 | if err != nil { |
| 287 | return fmt.Errorf("failed to send signal %s to process %d: %w", signal, task.PID, err) |
| 288 | } |
| 289 | |
| 290 | // 等待进程退出 |
| 291 | if timeout > 0 { |
| 292 | go tm.waitForProcessExit(task, timeout) |
| 293 | } |
| 294 | |
| 295 | // 更新任务状态 |
| 296 | task.Status = "killed" |
| 297 | task.LastUpdate = time.Now() |
| 298 | _ = tm.saveTask(task) |
| 299 | |
| 300 | return nil |
| 301 | } |
| 302 | |
| 303 | // ListTasks 列出所有任务 |
| 304 | func (tm *FileTaskManager) ListTasks() ([]*TaskInfo, error) { |
nothing calls this directly
no test coverage detected