diff --git a/JiangsuEarthquakeNow.zip b/JiangsuEarthquakeNow.zip deleted file mode 100644 index d771923..0000000 Binary files a/JiangsuEarthquakeNow.zip and /dev/null differ diff --git a/MonitoringProgram.zip b/MonitoringProgram.zip deleted file mode 100644 index a1b59c2..0000000 Binary files a/MonitoringProgram.zip and /dev/null differ diff --git a/MonitoringProgram/MonitoringProgram.sln b/MonitoringProgram/MonitoringProgram.sln new file mode 100644 index 0000000..e04d4e1 --- /dev/null +++ b/MonitoringProgram/MonitoringProgram.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.33627.172 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonitoringProgram", "MonitoringProgram\MonitoringProgram.csproj", "{5C9A40BE-56F7-45AE-9C94-38B133BAEACA}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5C9A40BE-56F7-45AE-9C94-38B133BAEACA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5C9A40BE-56F7-45AE-9C94-38B133BAEACA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5C9A40BE-56F7-45AE-9C94-38B133BAEACA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5C9A40BE-56F7-45AE-9C94-38B133BAEACA}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {05158ADA-BBD5-4562-BAE4-52B1E3DEA037} + EndGlobalSection +EndGlobal diff --git a/MonitoringProgram/MonitoringProgram/App.config b/MonitoringProgram/MonitoringProgram/App.config new file mode 100644 index 0000000..56efbc7 --- /dev/null +++ b/MonitoringProgram/MonitoringProgram/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/MonitoringProgram/MonitoringProgram/Form1.Designer.cs b/MonitoringProgram/MonitoringProgram/Form1.Designer.cs new file mode 100644 index 0000000..1e2339a --- /dev/null +++ b/MonitoringProgram/MonitoringProgram/Form1.Designer.cs @@ -0,0 +1,55 @@ +namespace MonitoringProgram +{ + partial class Form1 + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows 窗体设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.timerCheckProcessState = new System.Windows.Forms.Timer(this.components); + this.SuspendLayout(); + // + // timerCheckProcessState + // + this.timerCheckProcessState.Tick += new System.EventHandler(this.timerCheckProcessState_Tick); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Name = "Form1"; + this.Text = "Form1"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Timer timerCheckProcessState; + } +} + diff --git a/MonitoringProgram/MonitoringProgram/Form1.cs b/MonitoringProgram/MonitoringProgram/Form1.cs new file mode 100644 index 0000000..c0b324d --- /dev/null +++ b/MonitoringProgram/MonitoringProgram/Form1.cs @@ -0,0 +1,191 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Diagnostics; +using System.Drawing; +using System.Linq; +using System.Net.NetworkInformation; +using System.Net; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Runtime.InteropServices; + + +namespace MonitoringProgram +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + this.ShowInTaskbar = false;//任务栏中显示标志 + this.Visible = false;//可视化属性 + this.Width = 0; this.Height = 0;//设置没有高度和宽度 + this.Left = -10000; this.Top = -10000;//宽高属性窗口位置放置到桌面界面外 + this.Opacity = 0;//最重要的一个属性 不透明度 + + Process[] process = Process.GetProcessesByName("JiangsuEarthquake"); + if (process.Length == 0) + { + bool isUse = PortInUse(8899)|| PortInUse(8896); + Console.WriteLine("端口占用情况:" + isUse.ToString()); + if (isUse) + { + //端口被占用 + portInUseTime++; + } + else + { + var target = Process.Start(exePath, "auto"); + targetProcessId = target.Id; + } + } + else + { + targetProcessId = process[0].Id; + } + + Console.WriteLine(targetProcessId); + + //定时监测exe的运行状态 + timerCheckProcessState.Interval = 60 * 1000; + timerCheckProcessState.Enabled = true; + timerCheckProcessState.Start(); + } + + //PID + int targetProcessId = 0; + string exePath = "F:\\Code\\JSEQ\\20240301_JSEQ_upperpc1\\JiangsuEarthquakeNow\\JiangsuEarthquake\\bin\\Debug\\net6.0-windows\\JiangsuEarthquake.exe"; + + int portInUseTime = 0; + + + //判断端口是否被占用 + public static bool PortInUse(int port) + { + bool inUse = false; + IPGlobalProperties ipProperties = IPGlobalProperties.GetIPGlobalProperties(); + IPEndPoint[] ipEndPoints = ipProperties.GetActiveTcpListeners(); + foreach (IPEndPoint endPoint in ipEndPoints) + { + if (endPoint.Port == port) + { + inUse = true; + break; + } + } + return inUse; // 返回true说明端口被占用 + } + + + /// + /// 判断指定进程状态(是否正常运行) + /// + /// + /// + /// 进程状态正常:true + /// 进程卡死:false + /// + public bool checkProcess(Process p) + { + //判断进程是否响应(进程是否整体卡死) + if (p.Responding) + { + //指定进程的总线程数 + int thSumCount = p.Threads.Count; + //指定进程的无响应线程数 + int suspendCount = 0; + foreach (ProcessThread t in p.Threads) + { + //进程处于等待状态 + if (t.ThreadState == System.Diagnostics.ThreadState.Wait) + { + //等待原因为挂起 + if (t.WaitReason == ThreadWaitReason.Suspended) + suspendCount++; + } + } + //除了一个异常报错的对话框线程,其他线程都挂起了,说明进程已经卡死 + if (thSumCount > 1 && thSumCount == suspendCount + 1) + { + //PLogger.Info("target thread(" + thSumCount + "/" + suspendCount + ") is Responding"); + return false; + } + //进程及其中线程响应中 + return true; + } + else + { + return false; + } + } + + + private void timerCheckProcessState_Tick(object sender, EventArgs e) + { + Process[] process = null; + try + { + // 获取指定ID的进程 + //process = Process.GetProcessById(targetProcessId); + process = Process.GetProcessesByName("JiangsuEarthquake"); + } + catch (Exception ex) + { + Console.WriteLine("GetProcessByIdError:" + ex.Message); + } + + try + { + if (process == null || process.Length == 0) + { + Console.WriteLine("进程不存在或已退出,开始监测端口是否被占用!"); + + bool isUse = PortInUse(8899) || PortInUse(8896); + Console.WriteLine("端口占用情况:" + isUse.ToString()); + if (isUse) + { + //端口被占用 + portInUseTime++; + + if (portInUseTime > 4) + { + //重启工控机,30s后重启 + Process.Start("shutdown", "/r /t 30"); // 参数 /r 的意思是要重新启动计算机 + } + } + else + { + //端口未被占用 + portInUseTime = 0; + + // 进程不存在 已退出 ,需要重启 + // 重启代码 + var target = Process.Start(exePath, "auto"); + targetProcessId = target.Id; + } + } + else if (checkProcess(process[0]) == false) + { + Console.WriteLine("进程卡死,30后重启计算机!"); + + //进程卡死 + process[0].Kill(); + + //重启工控机,30s后重启 + Process.Start("shutdown", "/r /t 30"); // 参数 /r 的意思是要重新启动计算机 + } + else + { + Console.WriteLine("进程继续运行!"); + } + } + catch (Exception ex) + { + Console.WriteLine("CheckProcessStateError:" + ex.Message); + } + } + } +} diff --git a/MonitoringProgram/MonitoringProgram/Form1.resx b/MonitoringProgram/MonitoringProgram/Form1.resx new file mode 100644 index 0000000..0d087d3 --- /dev/null +++ b/MonitoringProgram/MonitoringProgram/Form1.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/MonitoringProgram/MonitoringProgram/MonitoringProgram.csproj b/MonitoringProgram/MonitoringProgram/MonitoringProgram.csproj new file mode 100644 index 0000000..af2e3b4 --- /dev/null +++ b/MonitoringProgram/MonitoringProgram/MonitoringProgram.csproj @@ -0,0 +1,83 @@ + + + + + Debug + AnyCPU + {5C9A40BE-56F7-45AE-9C94-38B133BAEACA} + WinExe + MonitoringProgram + MonitoringProgram + v4.7.2 + 512 + true + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + \ No newline at end of file diff --git a/MonitoringProgram/MonitoringProgram/Program.cs b/MonitoringProgram/MonitoringProgram/Program.cs new file mode 100644 index 0000000..22adb28 --- /dev/null +++ b/MonitoringProgram/MonitoringProgram/Program.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace MonitoringProgram +{ + internal static class Program + { + /// + /// 应用程序的主入口点。 + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Process[] proccess = Process.GetProcesses();//获取所有进程 + string strCaCuProcessName = "MonitoringProgram";//当前程序名 + foreach (var pr in proccess) + { + if (pr.ProcessName == strCaCuProcessName && pr.Id != Process.GetCurrentProcess().Id) + { + //当前程序名相等且进程ID不一致,不加进程ID程序起不来(这时候程序已经运行着) + Environment.Exit(0); + } + } + Application.Run(new Form1()); + } + + } +} diff --git a/MonitoringProgram/MonitoringProgram/Properties/AssemblyInfo.cs b/MonitoringProgram/MonitoringProgram/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..77a599a --- /dev/null +++ b/MonitoringProgram/MonitoringProgram/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("MonitoringProgram")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("MonitoringProgram")] +[assembly: AssemblyCopyright("Copyright © 2023")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("5c9a40be-56f7-45ae-9c94-38b133baeaca")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/MonitoringProgram/MonitoringProgram/Properties/Resources.Designer.cs b/MonitoringProgram/MonitoringProgram/Properties/Resources.Designer.cs new file mode 100644 index 0000000..bb844e5 --- /dev/null +++ b/MonitoringProgram/MonitoringProgram/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本: 4.0.30319.42000 +// +// 对此文件的更改可能导致不正确的行为,如果 +// 重新生成代码,则所做更改将丢失。 +// +//------------------------------------------------------------------------------ + +namespace MonitoringProgram.Properties +{ + + + /// + /// 强类型资源类,用于查找本地化字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// 返回此类使用的缓存 ResourceManager 实例。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MonitoringProgram.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/MonitoringProgram/MonitoringProgram/Properties/Resources.resx b/MonitoringProgram/MonitoringProgram/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/MonitoringProgram/MonitoringProgram/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/MonitoringProgram/MonitoringProgram/Properties/Settings.Designer.cs b/MonitoringProgram/MonitoringProgram/Properties/Settings.Designer.cs new file mode 100644 index 0000000..3be4e2a --- /dev/null +++ b/MonitoringProgram/MonitoringProgram/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace MonitoringProgram.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/MonitoringProgram/MonitoringProgram/Properties/Settings.settings b/MonitoringProgram/MonitoringProgram/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/MonitoringProgram/MonitoringProgram/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + +