6 Commits

3 changed files with 67 additions and 25 deletions
+10 -6
View File
@@ -99,9 +99,13 @@ This file provides a C# wrapper for the NVIDIA Management Library (NVML) functio
Feel free to contribute by opening issues or submitting pull requests. Make sure to follow the project's coding style and best practices. Feel free to contribute by opening issues or submitting pull requests. Make sure to follow the project's coding style and best practices.
# devnote ## devnote
dotnet run - **Commonlly use command**:
git add . - dotnet run
git commit -m "Add steam running games" - git add .
git push origin master - git commit -m "Add steam running games"
dotnet publish -c Release -o ./publish - git push origin master
- dotnet publish -c Release -o ./publish
- **Using git bash**:
- curl -X POST "http://localhost:5000/api/kill-process" -H "Content-Type: application/json" -d '3333333'
+49 -19
View File
@@ -22,6 +22,16 @@ namespace ResourceMonitorService
protected override async Task ExecuteAsync(CancellationToken stoppingToken) protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{ {
var builder = WebApplication.CreateBuilder(); var builder = WebApplication.CreateBuilder();
/* builder.WebHost.ConfigureKestrel(options =>
{
options.ListenAnyIP(5000); // Replace 5000 with your desired port
}); */
/* builder.WebHost.ConfigureKestrel(options =>
{
var url = builder.Configuration.GetValue<string>("Kestrel:Endpoints:Http:Url");
var port = url.Split(':').Last();
options.ListenAnyIP(int.Parse(port));
}); */
builder.Services.AddCors(options => builder.Services.AddCors(options =>
{ {
options.AddPolicy("AllowAllOrigins", options.AddPolicy("AllowAllOrigins",
@@ -59,7 +69,42 @@ namespace ResourceMonitorService
await context.Response.WriteAsync(json); await context.Response.WriteAsync(json);
}); });
_ = app.RunAsync(stoppingToken); app.MapPost("/api/kill-process", async context =>
{
try
{
var idStr = await new StreamReader(context.Request.Body).ReadToEndAsync();
int processId = Convert.ToInt32(idStr);
Process[] processes = Process.GetProcesses().Where(p => p.Id == processId).ToArray();
if (processes.Length > 0)
{
foreach (var process in processes)
{
try
{
process.Kill();
await context.Response.WriteAsync($"Process with ID {processId} has been killed.");
}
catch (Exception ex)
{
await context.Response.WriteAsync($"Error killing process with ID {processId}: {ex.Message}");
}
}
}
else
{
await context.Response.WriteAsync($"No process found with ID {processId}.");
}
}
catch (Exception ex)
{
await context.Response.WriteAsync($"An error occurred: {ex.Message}");
}
});
app.RunAsync(stoppingToken);
await Task.Delay(Timeout.Infinite, stoppingToken); await Task.Delay(Timeout.Infinite, stoppingToken);
} }
@@ -77,17 +122,11 @@ namespace ResourceMonitorService
private object GetCpuUsage() private object GetCpuUsage()
{ {
#pragma warning disable CA1416 // Validate platform compatibility
var cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total"); var cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
#pragma warning restore CA1416 // Validate platform compatibility
#pragma warning disable CA1416 // Validate platform compatibility
cpuCounter.NextValue(); cpuCounter.NextValue();
#pragma warning restore CA1416 // Validate platform compatibility
Thread.Sleep(1000); // Wait a second to get a valid reading Thread.Sleep(1000); // Wait a second to get a valid reading
#pragma warning disable CA1416 // Validate platform compatibility
var usage = cpuCounter.NextValue(); var usage = cpuCounter.NextValue();
#pragma warning restore CA1416 // Validate platform compatibility
if (usage > 80) if (usage > 80)
{ {
// Get the current processes and sort them by CPU usage in descending order // Get the current processes and sort them by CPU usage in descending order
@@ -99,18 +138,21 @@ namespace ResourceMonitorService
Usage = usage, Usage = usage,
Process1 = new Process1 = new
{ {
Id = processes.ElementAt(0).Id,
Name = processes.ElementAt(0).ProcessName, Name = processes.ElementAt(0).ProcessName,
TotalProcessorTime = processes.ElementAt(0).TotalProcessorTime, TotalProcessorTime = processes.ElementAt(0).TotalProcessorTime,
WorkingSet64 = processes.ElementAt(0).WorkingSet64 / (1024 * 1024) // Convert to MB WorkingSet64 = processes.ElementAt(0).WorkingSet64 / (1024 * 1024) // Convert to MB
}, },
Process2 = new Process2 = new
{ {
Id = processes.ElementAt(1).Id,
Name = processes.ElementAt(1).ProcessName, Name = processes.ElementAt(1).ProcessName,
TotalProcessorTime = processes.ElementAt(1).TotalProcessorTime, TotalProcessorTime = processes.ElementAt(1).TotalProcessorTime,
WorkingSet64 = processes.ElementAt(1).WorkingSet64 / (1024 * 1024) // Convert to MB WorkingSet64 = processes.ElementAt(1).WorkingSet64 / (1024 * 1024) // Convert to MB
}, },
Process3 = new Process3 = new
{ {
Id = processes.ElementAt(2).Id,
Name = processes.ElementAt(2).ProcessName, Name = processes.ElementAt(2).ProcessName,
TotalProcessorTime = processes.ElementAt(2).TotalProcessorTime, TotalProcessorTime = processes.ElementAt(2).TotalProcessorTime,
WorkingSet64 = processes.ElementAt(2).WorkingSet64 / (1024 * 1024) // Convert to MB WorkingSet64 = processes.ElementAt(2).WorkingSet64 / (1024 * 1024) // Convert to MB
@@ -126,30 +168,20 @@ namespace ResourceMonitorService
private float GetRamUsage() private float GetRamUsage()
{ {
#pragma warning disable CA1416 // Validate platform compatibility
var ramCounter = new PerformanceCounter("Memory", "Available MBytes"); var ramCounter = new PerformanceCounter("Memory", "Available MBytes");
#pragma warning restore CA1416 // Validate platform compatibility
var totalMemory = GetTotalPhysicalMemory(); var totalMemory = GetTotalPhysicalMemory();
#pragma warning disable CA1416 // Validate platform compatibility
var availableMemory = ramCounter.NextValue() * 1024 * 1024; var availableMemory = ramCounter.NextValue() * 1024 * 1024;
#pragma warning restore CA1416 // Validate platform compatibility
return (float)(totalMemory - availableMemory) / totalMemory * 100; return (float)(totalMemory - availableMemory) / totalMemory * 100;
} }
private ulong GetTotalPhysicalMemory() private ulong GetTotalPhysicalMemory()
{ {
ulong totalMemory = 0; ulong totalMemory = 0;
#pragma warning disable CA1416 // Validate platform compatibility
var searcher = new ManagementObjectSearcher("SELECT TotalPhysicalMemory FROM Win32_ComputerSystem"); var searcher = new ManagementObjectSearcher("SELECT TotalPhysicalMemory FROM Win32_ComputerSystem");
#pragma warning restore CA1416 // Validate platform compatibility
#pragma warning disable CA1416 // Validate platform compatibility
foreach (var obj in searcher.Get()) foreach (var obj in searcher.Get())
{ {
#pragma warning disable CA1416 // Validate platform compatibility
totalMemory = (ulong)obj["TotalPhysicalMemory"]; totalMemory = (ulong)obj["TotalPhysicalMemory"];
#pragma warning restore CA1416 // Validate platform compatibility
} }
#pragma warning restore CA1416 // Validate platform compatibility
return totalMemory; return totalMemory;
} }
@@ -185,9 +217,7 @@ namespace ResourceMonitorService
{ {
try try
{ {
#pragma warning disable CS8602 // Dereference of a possibly null reference.
var filePath = process.MainModule.FileName; var filePath = process.MainModule.FileName;
#pragma warning restore CS8602 // Dereference of a possibly null reference.
if (filePath.Contains(@"\steamapps\common\")) if (filePath.Contains(@"\steamapps\common\"))
{ {
// Extract the game directory name // Extract the game directory name
+8
View File
@@ -4,5 +4,13 @@
"Default": "Information", "Default": "Information",
"Microsoft.Hosting.Lifetime": "Information" "Microsoft.Hosting.Lifetime": "Information"
} }
},
"RunAsWindowsService": false,
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://*:5000"
}
}
} }
} }