Fix task status reset issue - preserve running tasks on restart

Co-authored-by: whyour <22700758+whyour@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot] 2025-12-22 14:42:44 +00:00
parent d64dc64df7
commit f043aa62e4
2 changed files with 25 additions and 2 deletions

View File

@ -397,6 +397,16 @@ export function psTree(pid: number): Promise<number[]> {
}); });
} }
export function isPidRunning(pid: number): boolean {
try {
// Signal 0 doesn't kill the process, just checks if it exists
process.kill(pid, 0);
return true;
} catch (error) {
return false;
}
}
export async function killTask(pid: number) { export async function killTask(pid: number) {
const pids = await psTree(pid); const pids = await psTree(pid);

View File

@ -13,7 +13,7 @@ import { AuthDataType, SystemModel } from '../data/system';
import SystemService from '../services/system'; import SystemService from '../services/system';
import UserService from '../services/user'; import UserService from '../services/user';
import { writeFile, readFile } from 'fs/promises'; import { writeFile, readFile } from 'fs/promises';
import { createRandomString, fileExist, safeJSONParse } from '../config/util'; import { createRandomString, fileExist, safeJSONParse, isPidRunning } from '../config/util';
import OpenService from '../services/open'; import OpenService from '../services/open';
import { shareStore } from '../shared/store'; import { shareStore } from '../shared/store';
import Logger from './logger'; import Logger from './logger';
@ -132,7 +132,20 @@ export default async () => {
}); });
// 初始化更新所有任务状态为空闲 // 初始化更新所有任务状态为空闲
await CrontabModel.update({ status: CrontabStatus.idle }, { where: {} }); // 但保留仍在运行的任务的状态
const allCrons = await CrontabModel.findAll({ raw: true });
for (const cron of allCrons) {
// 如果任务有 PID 且进程仍在运行,则保持其状态
if (cron.pid && isPidRunning(cron.pid)) {
// 保留当前状态running 或 queued
continue;
}
// 否则将状态重置为 idle并清除 PID
await CrontabModel.update(
{ status: CrontabStatus.idle, pid: undefined },
{ where: { id: cron.id } }
);
}
// 初始化时执行一次所有的 ql repo 任务 // 初始化时执行一次所有的 ql repo 任务
CrontabModel.findAll({ CrontabModel.findAll({