解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
|
# ½ø³ÌÀ©Õ¹ 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)
|