Process[] processes = Process.GetProcessesByName(strProcessName);
long memoryUsed = processes[0].PrivateMemorySize64;
LogHelper.log("当前开销 " +memoryUsed+" Bytes");
if(memoryThreshold*1024*1024<memoryUsed)
{
killProcess(strProcessName);
//重启
//String strCommand="C:\\Windows\\System32\\cmd.exe";
String strCommand = textBoxCommand.Text.Trim();
ShellExecute(IntPtr.Zero, null, strCommand, null, null, 5);//#define SW_SHOW 5
break;
}
以上是检查内存开销,关闭进程,调用外部命令的C#代码。
其中,ShellExecute的定义如下:
[DllImport("shell32.dll ")]
public static extern int ShellExecute(IntPtr hwnd,
String lpszOp,
String lpszFile,
String lpszParams,
String lpszDir,
int FsShowCmd);
整个的源代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;
namespace Reseter
{
public partial class FormReset : Form
{
[DllImport("Kernel32.dll")]
private static extern bool AllocConsole();
[DllImport("shell32.dll ")]
public static extern int ShellExecute(IntPtr hwnd,
String lpszOp,
String lpszFile,
String lpszParams,
String lpszDir,
int FsShowCmd);
[DllImport("kernel32.dll",
EntryPoint = "GetStdHandle",
SetLastError = true,
CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall)]
private static extern IntPtr GetStdHandle(int nStdHandle);
private const int STD_OUTPUT_HANDLE = -11;
//private const int MY_CODE_PAGE = 936; 设置汉字编码
public FormReset()
{
InitializeComponent();
}
private void FormReset_Load(object sender, EventArgs e)
{
setOutput();
button1.Hide();
}
private void buttonMonitor_Click(object sender, EventArgs e)
{
String strProcessName=textBoxProcessName.Text.Trim();
try
{
double memoryThreshold = Convert.ToDouble(textBoxMemorySize.Text.Trim());
LogHelper.log("开始监控进程"+strProcessName+",当内存开销大于"+"M时,会关闭进程,并运行重启命令");
while (true)
{
if (isProcessRunning(strProcessName) == false)
{
LogHelper.log( "当前系统中没有运行" + strProcessName);
break;
}
else
{
Process[] processes = Process.GetProcessesByName(strProcessName);
long memoryUsed = processes[0].PrivateMemorySize64;
LogHelper.log("当前开销 " +memoryUsed+" Bytes");
if(memoryThreshold*1024*1024<memoryUsed)
{
killProcess(strProcessName);
//重启
//String strCommand="C:\\Windows\\System32\\cmd.exe";
String strCommand = textBoxCommand.Text.Trim();
ShellExecute(IntPtr.Zero, null, strCommand, null, null, 5);//#define SW_SHOW 5
break;
}
}
LogHelper.log("2分钟监控一次");
System.Threading.Thread.Sleep(60 * 1000);
}
}
catch (Exception err)
{
MessageBox.Show("请输入一个合法的整数");
textBoxMemorySize.Text = "";
textBoxMemorySize.Focus();
}
}
//关闭进程
public void killProcess(String strName)
{
Process[] processList = System.Diagnostics.Process.GetProcessesByName(strName);
if (processList.Length > 0)
{
for (int i = 0; i < processList.Length; i++)
{
LogHelper.log("关闭" + strName + "进程");
processList[i].Kill();
}
}
}
/**
* 判断一个进程是否存在,去掉后缀名,例如检查excel
* */
private bool isProcessRunning(String strName)
{
Process[] iFindProcess = System.Diagnostics.Process.GetProcessesByName(strName);
if (iFindProcess.Length > 0)
{
return true;
}
else
{
return false;
}
}
private void setOutput()
{
AllocConsole();
IntPtr stdHandle = GetStdHandle(STD_OUTPUT_HANDLE);
SafeFileHandle safeFileHandle = new SafeFileHandle(stdHandle, true);
FileStream fileStream = new FileStream(safeFileHandle, FileAccess.Write);
Encoding encoding = System.Text.Encoding.GetEncoding(Console.OutputEncoding.CodePage);
StreamWriter standardOutput = new StreamWriter(fileStream, encoding);
standardOutput.AutoFlush = true;
Console.SetOut(standardOutput);
}
private void textBoxCommand_TextChanged(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
//String strCommand = "C:\\Windows\\System32\\cmd.exe";
String strCommand = "C:\\hello.bat";
//String strCommand = textBoxCommand.Text.Trim();
ShellExecute(IntPtr.Zero, null, strCommand, null, null, 5);//#define SW_SHOW 5
}
}
}