static ExeStatus AlwaysOrOneTime(TaskItem task, List <ProcessItem> processes, StringBuilder msg) { var ret = ExeStatus.Running; // 查找进程是否运行中 msg.Append("\r\n\t"); if (task.runtype == RunType.OneTime) { // 更新为停止 Dal.Default.UpdateTaskType(task.id, task.runtype, RunType.Stop); msg.Append("(只运行一次)"); } if (processes.Count <= 0) { var lastRunDiffSecond = (DateTime.Now - task.pidtime).TotalSeconds; // 一直运行的,每2次启动必须间隔1分钟 if (task.runtype == RunType.OneTime || lastRunDiffSecond > 60) { // 启动进程 var pid = ProcessHelper.CheckAndStartProcess(task.exepath, task.exepara); if (pid > 0) { task.NewPid = pid; msg.Append("任务成功启动,pid:" + pid.ToString()); } else { msg.Append("任务存在,启动失败"); } } else { msg.Append("1分钟内任务只能启动1次"); ret = ExeStatus.Stopped; } } else { msg.Append("运行中pid:"); foreach (ProcessItem item in processes) { msg.AppendFormat("\t{0}", item.pid); } } Utils.Output(msg); return(ret); }
static ExeStatus StopAndWait1Min(TaskItem task, List <ProcessItem> processes, StringBuilder msg) { // 重启后要把它设置为一直运行 Dal.Default.UpdateTaskType(task.id, task.runtype, RunType.Always); if (processes.Count > 0) { // 杀死进程 var killNum = ProcessHelper.KillProcesses(processes); Utils.Output(task.desc + " " + task.exepath + "已停止" + killNum.ToString() + "个,等1分钟后重启..."); foreach (ProcessItem item in processes) { msg.AppendFormat("\r\n\t\t{0}", item); } msg.Append("\r\n\t已停止,等1分钟,"); } else { Utils.Output(task.desc + " " + task.exepath + "未启动,等1分钟后启动..."); msg.Append("\r\n\t进程不存在,等1分钟,"); } Thread.Sleep(TimeSpan.FromMinutes(1)); var ret = ProcessHelper.CheckAndStartProcess(task.exepath, task.exepara); if (ret > 0) { task.NewPid = ret; msg.Append("\r\n\t重启完成,pid:" + ret.ToString()); } else { msg.Append("\r\n\t进程存在,未启动"); } Utils.Output(msg); return(ExeStatus.Running); }
// RunType.Restart static ExeStatus Restart(TaskItem task, List <ProcessItem> processes, StringBuilder msg) { // 重启后要把它设置为一直运行 Dal.Default.UpdateTaskType(task.id, task.runtype, RunType.Always); if (processes.Count > 0) { // 杀死进程 var killNum = ProcessHelper.KillProcesses(processes); msg.Append("\r\n\t已停止" + killNum.ToString() + "个,"); } else { msg.Append("\r\n\t进程不存在,"); } // 启动进程 var ret = ProcessHelper.CheckAndStartProcess(task.exepath, task.exepara); if (ret > 0) { task.NewPid = ret; msg.Append("重启完成,pid:" + ret.ToString()); if (processes.Count > 0) { foreach (ProcessItem item in processes) { msg.AppendFormat("\r\n\t\t{0}", item); } } } else { msg.Append("进程存在,未启动"); } Utils.Output(msg); return(ExeStatus.Running); }
/// <summary> /// 对程序立即进行的启动或停止操作 /// </summary> /// <param name="strArgs"></param> /// <returns></returns> static string ImmediateProcess(string strArgs) { // string args = ((int) type).ToString() + "\n" + path + "\n" + exepara; string[] args = strArgs.Split('\n'); if (args.Length < 3) { return("参数不足3个"); } int imtype; if (!int.TryParse(args[0], out imtype)) { return("无效的临时类型"); } string exepath = args[1]; // 防止出现 c:\\\\a.exe 或 c:/a.exe这样的路径,统一格式化成:c:\a.exe形式 exepath = Path.Combine(Path.GetDirectoryName(exepath) ?? "", Path.GetFileName(exepath) ?? ""); if (exepath.IndexOf('/') < 0 && exepath.IndexOf('\\') < 0) { string tmp = FindExeFromAllJob(exepath); if (string.IsNullOrEmpty(tmp)) { return("未找到对应job:" + exepath); } exepath = tmp; } if (!File.Exists(exepath)) { return("文件不存在:" + exepath); } string exepara = args[2]; int ret; switch ((ImmediateType)imtype) { default: return("不存在的临时类型"); case ImmediateType.Start: // 查找进程是否运行中,不在则启动 ret = ProcessHelper.CheckAndStartProcess(exepath, exepara); if (ret > 0) { return(exepath + " 成功启动, pid:" + ret.ToString()); } else { return(exepath + " 运行中,无需启动"); } case ImmediateType.Stop: var processes1 = ProcessItem.GetProcessByPath(exepath); ret = ProcessHelper.KillProcesses(processes1); if (ret > 0) { return(exepath + " 成功关闭个数:" + ret.ToString()); } else { return(exepath + " 未运行,无需停止"); } case ImmediateType.ReStart: string restartMsg; // 杀死进程 var processes2 = ProcessItem.GetProcessByPath(exepath); ret = ProcessHelper.KillProcesses(processes2); if (ret > 0) { restartMsg = exepath + " 成功关闭个数:" + ret.ToString(); } else { restartMsg = exepath + " 未启动"; } // 查找进程是否运行中,不在则启动 ret = ProcessHelper.CheckAndStartProcess(exepath, exepara); if (ret > 0) { return(restartMsg + " 重启完成,pid:" + ret.ToString()); } else { return(restartMsg + " 进程已存在"); } } }
static ExeStatus PerTime(TaskItem task, List <ProcessItem> processes, StringBuilder msg) { ExeStatus status; // 未设置定时运行参数时 if (!task.TaskPara.Any()) { status = ExeStatus.NoPara; // 更新任务运行状态 Dal.Default.UpdateTaskExeStatus(task.id, status); msg.Append("\r\n\t任务参数未配置,运行失败"); Utils.Output(msg.ToString()); return(status); } if (processes.Count <= 0) { status = ExeStatus.Stopped; } else { foreach (ProcessItem item in processes) { msg.AppendFormat("\r\n\t\t{0}", item); } status = ExeStatus.Running; } StringBuilder sbEndTime = new StringBuilder(); var now = DateTime.Now; bool? isrun = null; foreach (TimePara timepara in task.TaskPara) { if (task.runtype == RunType.PerWeek && timepara.WeekOrDay != (int)now.DayOfWeek) { continue; } if (task.runtype == RunType.PerMonth && timepara.WeekOrDay != now.Day) { continue; } // 启动小时必须是小于24的数,否则会出异常 int hour = timepara.StartHour;// == 24 ? 0 : timepara.StartHour; if (hour < 0) { hour = 0; } else if (hour >= 24) { hour = 0; } int min = timepara.StartMin; if (min > 59) { min = 59; } else if (min < 0) { min = 0; } DateTime starttime = new DateTime(now.Year, now.Month, now.Day, hour, min, 0); if (timepara.StartHour >= 24) { starttime = starttime.AddDays(1); } DateTime endtime = DateTime.MaxValue; // 为true表示启动时间是从数据库获取的 bool isTimeParaSeted = false; if (timepara.RunMinute > 0) { // 从数据库取得记录的结束时间(之所以保存到数据库,因为每次任务都是从db取得,每次StartTime都会被重置,导致隔日停止失败) timepara.StartTime = Dal.Default.GetTimePara(task.id, timepara); if (timepara.StartTime == default(DateTime)) { timepara.StartTime = starttime; } else { isTimeParaSeted = true; } endtime = timepara.StartTime.AddMinutes(timepara.RunMinute); sbEndTime.Append("\r\n\t" + timepara.StartTime.ToString("MM-dd_HH:mm") + "~" + endtime.ToString("MM-dd_HH:mm")); } // 任务已经处理过了 if (isrun != null) { continue; } // 前次运行时间比定时小 且 时间到了 且 进程没有运行 且 没过结束时间 //if (starttime > task.pidtime && starttime <= now && now < endtime) // 在启动时间之后,且在1分钟之内,启动它 if (starttime <= now && now < endtime && (now - starttime).TotalSeconds < 60) { isrun = true; // 记录开始时间,以便下次轮询判断结束 if (isTimeParaSeted) { Dal.Default.DelTimePara(task.id, timepara); } Dal.Default.AddTimePara(task.id, timepara); if (processes.Count <= 0) { var lastRunDiffSecond = (now - task.pidtime).TotalSeconds; if (lastRunDiffSecond > 60) { // 启动进程 var pid = ProcessHelper.CheckAndStartProcess(task.exepath, task.exepara); if (pid > 0) { task.NewPid = pid; msg.Append("任务成功启动,pid:" + pid.ToString()); } else { msg.Append("任务存在,启动失败"); } status = ExeStatus.Running; } else { msg.Append("\r\n\t任务1分钟只能启动1次"); status = ExeStatus.Stopped; } } else { msg.Append("\r\n\t" + processes.Count.ToString() + "个任务运行中"); status = ExeStatus.Running; } // 记录之,用于计算结束时间 if (timepara.RunMinute > 0) { timepara.StartTime = now; } // 不用break,是为了统计并输出结束时间日志 continue; } // now比endtime大,且在1分钟之内,停止它 if (endtime <= now && (now - endtime).TotalSeconds < 60 && processes.Count > 0) { isrun = false; // 结束完成,删除 开始时间记录,以便下次轮询重新计算 if (isTimeParaSeted) { Dal.Default.DelTimePara(task.id, timepara); } var killNum = ProcessHelper.KillProcesses(processes); if (killNum > 0) { msg.Append("\r\n\t任务成功终止" + killNum.ToString() + "个"); status = ExeStatus.Stopped; } else { msg.Append("\r\n\t任务终止失败"); } // 不用break,是为了统计并输出结束时间日志 //continue; } else if (endtime <= now && isTimeParaSeted) { // 清除上次启动时间,避免过期时间在以前,导致程序永远无法终止 Dal.Default.DelTimePara(task.id, timepara); } } if (isrun == null) { msg.Append("\r\n\t时间没到 " + (status == ExeStatus.Stopped ? "任务未启动" : "任务运行中")); } if (sbEndTime.Length > 0) { msg.Append("\r\n\t起止时间:" + sbEndTime); } Utils.Output(msg); return(status); }