解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
大石头 authored at 2018-05-15 21:21:05
9.02 KiB
X
# ½ø³ÌÀ©Õ¹ ProcessHelper ## ¸ÅÊö `ProcessHelper` ÊÇ NewLife.Core ÖеĽø³Ì¹ÜÀí¹¤¾ßÀ࣬Ìṩ½ø³Ì²éÕÒ¡¢½ø³Ì¿ØÖÆ¡¢ÃüÁîÐÐÖ´Ðеȹ¦ÄÜ¡£Ö§³Ö Windows ºÍ Linux ˫ƽ̨£¬Äܹ»Õýȷʶ±ð dotnet/java ËÞÖ÷½ø³ÌµÄÕæÊµÃû³Æ¡£ **ÃüÃû¿Õ¼ä**£º`NewLife` **ÎĵµµØÖ·**£ºhttps://newlifex.com/core/process_helper ## ºËÐÄÌØÐÔ - **¿çƽ̨֧³Ö**£ºÍ¬Ê±Ö§³Ö Windows ºÍ Linux ϵͳ - **ËÞÖ÷½ø³Ìʶ±ð**£ºÕýȷʶ±ð dotnet/java Íйܽø³ÌµÄÕæÊµ³ÌÐòÃû - **°²È«½ø³Ì¿ØÖÆ**£ºÌṩκÍÍ˳öºÍÇ¿ÖÆÖÕÖ¹Á½ÖÖ·½Ê½ - **ÃüÁîÐÐÖ´ÐÐ**£ºÖ§³Öͬ²½/Òì²½Ö´ÐС¢Êä³ö²¶»ñ¡¢³¬Ê±¿ØÖÆ ## ¿ìËÙ¿ªÊ¼ ```csharp using NewLife; using System.Diagnostics; // »ñÈ¡½ø³ÌÕæÊµÃû³Æ£¨Ö§³Ö dotnet/java ËÞÖ÷£© var process = Process.GetCurrentProcess(); var name = process.GetProcessName(); // Ö´ÐÐÃüÁî²¢»ñÈ¡Êä³ö var output = "ipconfig".Execute("/all"); // ÒÔÒþ²Ø´°¿ÚÖ´ÐÐÃüÁî "notepad.exe".Run("test.txt", 0); // °²È«Í˳ö½ø³Ì process.SafetyKill(); // Ç¿ÖÆÖÕÖ¹½ø³ÌÊ÷ process.ForceKill(); ``` ## API ²Î¿¼ ### ½ø³Ì²éÕÒ #### GetProcessName ```csharp public static String GetProcessName(this Process process) ``` »ñÈ¡½ø³ÌµÄÂß¼­Ãû³Æ¡£¶ÔÓÚ dotnet/java ËÞÖ÷½ø³Ì£¬·µ»ØÕæÕýµÄÄ¿±ê³ÌÐò¼¯/Èë¿Ú Jar Ãû³Æ£¨²»º¬À©Õ¹Ãû£©¡£ **Ó¦Óó¡¾°**£º - ½ø³Ì¼à¿ØºÍ¹ÜÀí - ·þÎñ·¢ÏÖ - ÈÕÖ¾¼Ç¼ÖÐʶ±ðÕæÊµÓ¦ÓÃÃû **ʾÀý**£º ```csharp // ÆÕͨ½ø³Ì var notepad = Process.GetProcessesByName("notepad")[0]; notepad.GetProcessName() // "notepad" // dotnet ËÞÖ÷½ø³Ì£¨ÔËÐÐ MyApp.dll£© // ÃüÁîÐУºdotnet /path/to/MyApp.dll --arg1 value1 var dotnetProcess = ...; dotnetProcess.GetProcessName() // "MyApp" // java ËÞÖ÷½ø³Ì£¨ÔËÐÐ app.jar£© // ÃüÁîÐУºjava -jar /path/to/app.jar var javaProcess = ...; javaProcess.GetProcessName() // "app" ``` #### GetCommandLine ```csharp public static String? GetCommandLine(Int32 processId) ``` »ñȡָ¶¨½ø³ÌµÄÍêÕûÃüÁîÐÐ×Ö·û´®¡£ **ƽ̨ʵÏÖ**£º - **Linux**£º¶ÁÈ¡ `/proc/{pid}/cmdline` Îļþ - **Windows**£ºÍ¨¹ý `NtQueryInformationProcess` ¶ÁÈ¡½ø³Ì PEB **ʾÀý**£º ```csharp var cmdLine = ProcessHelper.GetCommandLine(1234); // Windows: "C:\Program Files\dotnet\dotnet.exe" MyApp.dll --env Production // Linux: /usr/bin/dotnet MyApp.dll --env Production ``` #### GetCommandLineArgs ```csharp public static String[]? GetCommandLineArgs(Int32 processId) ``` »ñȡָ¶¨½ø³ÌµÄÃüÁîÐвÎÊýÊý×é¡£ **ʾÀý**£º ```csharp var args = ProcessHelper.GetCommandLineArgs(1234); // ["dotnet", "MyApp.dll", "--env", "Production"] ``` ### ½ø³Ì¿ØÖÆ #### SafetyKill ```csharp public static Process? SafetyKill(this Process process, Int32 msWait = 5_000, Int32 times = 50, Int32 interval = 200) ``` °²È«Í˳ö½ø³Ì£¨Îºͷ½Ê½£©¡£·¢ËÍÕý³£ÖÕÖ¹Ðźţ¬Èýø³ÌÓлú»áÖ´ÐÐÇåÀí´úÂë¡£ **²ÎÊý˵Ã÷**£º - `msWait`£º·¢ËÍÐźźóµÄ³õʼµÈ´ýʱ¼ä£¬Ä¬ÈÏ 5000 ºÁÃë - `times`£ºÂÖѯ¼ì²â´ÎÊý£¬Ä¬ÈÏ 50 ´Î - `interval`£ºÂÖѯ¼ä¸ô£¬Ä¬ÈÏ 200 ºÁÃë **ƽ̨ʵÏÖ**£º - **Linux**£º·¢ËÍ `kill` Ðźţ¨Ä¬ÈÏ SIGTERM£© - **Windows**£ºÖ´ÐÐ `taskkill -pid {id}` **ʾÀý**£º ```csharp var process = Process.Start("MyApp.exe"); // κ͹رգ¬µÈ´ý×î¶à 10 Ãë process.SafetyKill(msWait: 10_000); // ¼ì²éÊÇ·ñ³É¹¦Í˳ö if (!process.GetHasExited()) { // ½ø³ÌδÔڹ涨ʱ¼äÄÚÍ˳ö£¬¿ÉÄÜÐèÒªÇ¿ÖÆÖÕÖ¹ process.ForceKill(); } ``` #### ForceKill ```csharp public static Process? ForceKill(this Process process, Int32 msWait = 5_000) ``` Ç¿ÖÆÖÕÖ¹½ø³ÌÊ÷£¬°üÀ¨ËùÓÐ×Ó½ø³Ì¡£ **ƽ̨ʵÏÖ**£º - **Linux**£º·¢ËÍ `kill -9` Ðźţ¨SIGKILL£© - **Windows**£ºÖ´ÐÐ `taskkill /t /f /pid {id}` - **.NET Core 3.0+**£ºÊ¹Óà `Process.Kill(true)` ÖÕÖ¹½ø³ÌÊ÷ **ʾÀý**£º ```csharp // Ç¿ÖÆÖÕÖ¹½ø³Ì¼°ÆäËùÓÐ×Ó½ø³Ì process.ForceKill(); // »òÕßÖ¸¶¨¸ü³¤µÄµÈ´ýʱ¼ä process.ForceKill(msWait: 10_000); ``` #### GetHasExited ```csharp public static Boolean GetHasExited(this Process process) ``` °²È«»ñÈ¡½ø³ÌÊÇ·ñÒÑÖÕÖ¹¡£µ±½ø³Ì¾ä±ú²»¿É·ÃÎÊʱ·µ»Ø `true`£¨ÊÓΪÒÑÍ˳ö£©¡£ **ʾÀý**£º ```csharp if (process.GetHasExited()) { Console.WriteLine("½ø³ÌÒÑÍ˳ö"); } ``` ### ÃüÁîÐÐÖ´ÐÐ #### Run ```csharp public static Int32 Run( this String cmd, String? arguments = null, Int32 msWait = 0, Action<String?>? output = null, Action<Process>? onExit = null, String? working = null) ``` ÒÔÒþ²Ø´°¿ÚÖ´ÐÐÃüÁîÐС£ **²ÎÊý˵Ã÷**£º - `cmd`£º¿ÉÖ´ÐÐÎļþÃû»ò·¾¶ - `arguments`£ºÃüÁîÐвÎÊý - `msWait`£ºµÈ´ýʱ¼ä£¨0=²»µÈ´ý£¬<0=ÎÞÏ޵ȴý£¬>0=×µÈ´ýºÁÃëÊý£© - `output`£ºÊä³ö»Øµ÷ίÍУ¨Ðè msWait > 0£© - `onExit`£º½ø³ÌÍ˳ö»Øµ÷ - `working`£º¹¤×÷Ŀ¼ **·µ»ØÖµ**£º½ø³ÌÍ˳ö´úÂ룻δµÈ´ý»ò³¬Ê±·µ»Ø -1 **ʾÀý**£º ```csharp // ²»µÈ´ý£¬ºǫִ́ÐÐ "notepad.exe".Run("test.txt"); // µÈ´ýÖ´ÐÐÍê³É£¬»ñÈ¡Í˳öÂë var exitCode = "ping".Run("localhost -n 4", 30_000); // ²¶»ñÊä³ö var output = new StringBuilder(); "ipconfig".Run("/all", 5_000, line => output.AppendLine(line)); Console.WriteLine(output.ToString()); // ´ø¹¤×÷Ŀ¼ "npm".Run("install", 60_000, working: @"C:\Projects\MyApp"); // ½ø³ÌÍ˳öʱ»Øµ÷ "MyApp.exe".Run(onExit: p => Console.WriteLine($"Í˳öÂë: {p.ExitCode}")); ``` #### ShellExecute ```csharp public static Process ShellExecute( this String fileName, String? arguments = null, String? workingDirectory = null) ``` ÔÚ Shell ÉÏÖ´ÐÐÃüÁĿ±ê½ø³Ì²»Êǵ±Ç°½ø³ÌµÄ×Ó½ø³Ì£¬²»»áËæ±¾½ø³ÌÍ˳ö¡£ **Ó¦Óó¡¾°**£º - ´ò¿ªÎļþ£¨Ê¹ÓÃϵͳĬÈϳÌÐò£© - ´ò¿ª URL£¨Ê¹ÓÃĬÈÏä¯ÀÀÆ÷£© - Æô¶¯¶ÀÁ¢Ó¦ÓóÌÐò **ʾÀý**£º ```csharp // ÓÃĬÈϳÌÐò´ò¿ªÎļþ "document.pdf".ShellExecute(); // ÓÃĬÈÏä¯ÀÀÆ÷´ò¿ªÍøÖ· "https://newlifex.com".ShellExecute(); // ÒÔ¹ÜÀíÔ±Éí·ÝÔËÐÐ // ×¢Ò⣺ÐèÒªÔÚ ProcessStartInfo ÖÐÉèÖà Verb = "runas" "cmd.exe".ShellExecute("/k echo Hello"); // Ö¸¶¨¹¤×÷Ŀ¼ "MyApp.exe".ShellExecute("--config app.json", @"C:\Apps"); ``` #### Execute ```csharp public static String? Execute( this String cmd, String? arguments = null, Int32 msWait = 0, Boolean returnError = false) ``` Ö´ÐÐÃüÁî²¢·µ»Ø±ê×¼Êä³öÄÚÈÝ¡£ **²ÎÊý˵Ã÷**£º - `msWait`£ºµÈ´ýʱ¼ä£¨0=×èÈûÖ±µ½Í˳ö£¬>0=³¬Ê±ºóǿɱ£© - `returnError`£ºÎÞ±ê×¼Êä³öʱÊÇ·ñ·µ»Ø´íÎóÊä³ö **ʾÀý**£º ```csharp // »ñÈ¡ IP ÅäÖà var ipConfig = "ipconfig".Execute("/all"); // »ñÈ¡ Git °æ±¾ var gitVersion = "git".Execute("--version"); // Ö´ÐÐ Linux ÃüÁî var diskUsage = "df".Execute("-h"); // ³¬Ê±¿ØÖÆ var result = "ping".Execute("localhost", 5_000); // ʧ°Üʱ·µ»Ø´íÎóÐÅÏ¢ var output = "invalid_cmd".Execute(returnError: true); ``` ## ʹÓó¡¾° ### 1. ·þÎñ¹ÜÀí ```csharp public class ServiceManager { public void StopService(String serviceName) { var processes = Process.GetProcesses() .Where(p => p.GetProcessName().EqualIgnoreCase(serviceName)); foreach (var process in processes) { // Ïȳ¢ÊÔÎÂºÍ¹Ø±Õ process.SafetyKill(msWait: 10_000); // Èç¹û»¹Ã»Í˳ö£¬Ç¿ÖÆÖÕÖ¹ if (!process.GetHasExited()) { process.ForceKill(); } } } } ``` ### 2. ½Å±¾Ö´ÐÐ ```csharp public class ScriptRunner { public String RunPowerShell(String script) { return "powershell".Execute($"-ExecutionPolicy Bypass -Command \"{script}\"", 60_000); } public String RunBash(String script) { return "bash".Execute($"-c \"{script}\"", 60_000); } } ``` ### 3. ½ø³Ì¼à¿Ø ```csharp public class ProcessMonitor { public void Monitor(String appName) { while (true) { var processes = Process.GetProcesses() .Where(p => p.GetProcessName().EqualIgnoreCase(appName)) .ToList(); Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] {appName} ½ø³ÌÊý: {processes.Count}"); foreach (var p in processes) { var cmdLine = ProcessHelper.GetCommandLine(p.Id); Console.WriteLine($" PID={p.Id}, CommandLine={cmdLine}"); } Thread.Sleep(5000); } } } ``` ## ×î¼Ñʵ¼ù ### 1. ÓÅÑŹرÕÓÅÏÈ ```csharp // ÍÆ¼ö£ºÏÈκͣ¬ÔÙÇ¿ÖÆ public void StopProcess(Process process) { // κ͹رգ¬¸ø½ø³ÌÇåÀíµÄ»ú»á process.SafetyKill(msWait: 5_000); // Èç¹û»¹Ã»Í˳ö£¬Ç¿ÖÆÖÕÖ¹ if (!process.GetHasExited()) { process.ForceKill(); } } ``` ### 2. ºÏÀíÉèÖó¬Ê± ```csharp // ¸ù¾ÝÃüÁîÌØµãÉèÖó¬Ê± var quickResult = "echo".Execute("Hello", msWait: 1_000); // ¿ìËÙÃüÁî var longResult = "npm".Execute("install", msWait: 300_000); // ºÄʱ²Ù×÷ ``` ### 3. ´¦ÀíÊä³ö»Øµ÷ ```csharp // ʵʱ´¦Àí´óÁ¿Êä³ö var lines = new List<String>(); "find".Run("/", 60_000, line => { if (!line.IsNullOrEmpty()) { lines.Add(line); if (lines.Count % 1000 == 0) Console.WriteLine($"ÒÑ´¦Àí {lines.Count} ÐÐ"); } }); ``` ## ƽ̨²îÒì | ¹¦ÄÜ | Windows | Linux | |------|---------|-------| | GetCommandLine | NtQueryInformationProcess | /proc/{pid}/cmdline | | SafetyKill | taskkill | kill (SIGTERM) | | ForceKill | taskkill /f /t | kill -9 (SIGKILL) | | ShellExecute | Shell Ö´ÐÐ | ÐèÒªÉèÖà UseShellExecute=true | ## ×¢ÒâÊÂÏî 1. **ȨÏÞÒªÇó**£º²¿·Ö²Ù×÷¿ÉÄÜÐèÒª¹ÜÀíÔ±/root ȨÏÞ 2. **½ø³ÌÊ÷ÖÕÖ¹**£º`ForceKill` »áÖÕÖ¹ËùÓÐ×Ó½ø³Ì£¬Çë½÷É÷ʹÓà 3. **ÃüÁîÐ㤶È**£ºWindows ÃüÁîÐ㤶ÈÏÞÖÆÔ¼ 8191 ×Ö·û 4. **±àÂëÎÊÌâ**£ºÖ´ÐÐÃüÁîʱעÒâÊä³ö±àÂ룬¿Éͨ¹ý `Encoding` ²ÎÊýÖ¸¶¨ ## Ïà¹ØÁ´½Ó - [ÔËÐÐʱÐÅÏ¢ Runtime](/NewLife/X/Blob/dev/Doc/runtime-ÔËÐÐʱÐÅÏ¢Runtime.md) - [ÇáÁ¿¼¶Ó¦ÓÃÖ÷»ú Host](/NewLife/X/Blob/dev/Doc/host-ÇáÁ¿¼¶Ó¦ÓÃÖ÷»úHost.md) - [·þÎñ¹ÜÀí NewLife.Agent](https://newlifex.com/core/agent)