/// <summary> /// 检查进程和任务是否匹配 /// </summary> /// <returns>The task and process match.</returns> /// <param name="task">Task.</param> /// <param name="process">Process.</param> private static bool CheckTaskAndProcessMatch(JobTask task, Process process, out SwiftProcessCommandLine commandLine) { commandLine = null; if (task == null || process == null) { return(false); } var job = task.Job; try { if (job.ExeType == "exe") { LogWriter.Write("将按照DirectExe格式解析进程命令行", LogLevel.Debug); commandLine = SwiftProcessCommandLine.Get(process, EnumExecutableFileType.DirectExe); } else if (job.ExeType == "dotnet") { LogWriter.Write("将按照DotNet格式解析进程命令行", LogLevel.Debug); commandLine = SwiftProcessCommandLine.Get(process, EnumExecutableFileType.DotNet); } else { throw new NotSupportedException("not supported executable file type: " + job.ExeType); } if (commandLine == null) { return(false); } LogWriter.Write("已经成功解析进程命令行:" + JsonConvert.SerializeObject(commandLine), LogLevel.Trace); if (!commandLine.Paras.TryGetValue("-jn", out string jobName)) { jobName = string.Empty; } if (!commandLine.Paras.TryGetValue("-jr", out string jobRecordId)) { jobRecordId = string.Empty; } if (!commandLine.Paras.TryGetValue("-t", out string taskId)) { taskId = string.Empty; } if (jobName == job.Name && jobRecordId == job.Id && task.Id.ToString() == taskId) { LogWriter.Write("进程命令和任务匹配", LogLevel.Debug); return(true); } LogWriter.Write("进程命令和任务不匹配", LogLevel.Debug); } catch (Exception ex) { LogWriter.Write("analysis process commndline go exception.", ex, LogLevel.Info); } return(false); }
/// <summary> /// 处理具体的任务 /// </summary> /// <param name="task"></param> /// <returns></returns> public override string ExecuteTask(JobTask task) { throw new NotImplementedException("这个方法不会被实现,应继承JobBase实现自己的Process"); }
/// <summary> /// Kills the abandoned task process. /// </summary> /// <param name="processId">Process identifier.</param> /// <param name="jobName">Job name.</param> /// <param name="jobId">Job identifier.</param> /// <param name="taskId">Task identifier.</param> public static void KillAbandonedTaskProcess(int processId, string jobName, string jobId, int taskId) { var businessId = JobTask.FormatBusinessId(jobName, jobId, taskId); Process osProcess = null; try { osProcess = Process.GetProcessById(processId); } catch (Exception ex) { LogWriter.Write(string.Format("根据进程Id查找进程异常,进程可能已经关闭了:{0},{1}", businessId, processId), ex, LogLevel.Info); } bool canDeleteProcessFile = true; if (osProcess != null) { if (SwiftProcess.CheckTaskAndProcessMatch(osProcess, jobName, jobId, taskId)) { try { osProcess.Kill(); osProcess.WaitForExit(); LogWriter.Write(string.Format("已关闭任务废弃的进程:{0},{1}", businessId, processId), LogLevel.Info); } catch (Exception ex) { canDeleteProcessFile = false; LogWriter.Write(string.Format("关闭任务废弃的进程异常:{0},{1}", businessId, processId), ex, LogLevel.Error); } } } if (canDeleteProcessFile) { var processPath = SwiftConfiguration.GetSwiftProcessPath("ExecuteTask", JobTask.FormatBusinessId(jobName, jobId, taskId)); try { File.Delete(processPath); LogWriter.Write(string.Format("进程文件已删除:{0}", processPath), LogLevel.Info); } catch (Exception ex) { LogWriter.Write(string.Format("删除任务废弃的进程文件异常:{0},{1}", businessId, processId), ex, LogLevel.Error); } } }