JRun Monitor
The following code is written in CSharp to monitor the underlying jrun. This code will restart coldfusion 8 whenever the CPU and memory usage exceeds 90% of the alloted resources for more than 5 minutes.Coldfusion JRun monitoring and auto-restart code in CSharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Diagnostics.PerformanceData;
using System.Management;
using System.IO;
using System.Threading;
using System.Collections;
namespace ConsoleApplication1
{
class Program
{
static string service = "JRUN";
static string serviceName = "ColdFusion 8 Application Server";
static bool jrunRunning = false;
static bool jrunRestart = false;
static int samplingInterval = 6000; // 6 seconds
static Queue qCPU = new Queue(30);
static Queue qMEM = new Queue(30);
static float cpuAvg = 0.0F;
static float memAvg = 0.0F;
static void Main(string[] args)
{
monitor(service, serviceName);
Console.Read();
}
static void monitor(string service, string serviceName)
{
// infinite loop
while (true)
{
jrunRunning = false;
// get the process as process list array
Process[] processList = Process.GetProcessesByName(service);
// if the process is avaialbe, then the process is running
if (processList != null && processList.Length == 1)
{
jrunRunning = true;
}
else
{
// if the process has not been restarted then restart it
if (!jrunRestart)
{
jrunRestart = true;
}
}
// restart the process only if is not running and is not already started
if (!jrunRunning && jrunRestart)
{
jrunRestart = false;
qCPU.Clear();
qMEM.Clear();
cpuAvg = 0;
memAvg = 0;
try
{
// process is not running, STOP and START the process, and give a gap of 5 seconds between the processes
processStop(serviceName);
Thread.Sleep(5000);
processStart(serviceName);
}
catch (Exception ex)
{
// if any exception, restart the server again
jrunRestart = true;
}
}
if (jrunRunning)
{
foreach (Process proc in processList)
{
// process specific CPU and Memory counters
PerformanceCounter cpu = new PerformanceCounter("Process", "% Processor Time", proc.ProcessName);
PerformanceCounter mem = new PerformanceCounter("Process", "Private Bytes", proc.ProcessName);
cpu.NextValue();
mem.NextValue();
System.Threading.Thread.Sleep(1000);
float fcpu = cpu.NextValue();
// sometimes, the cpu will be over 100% (Example 171.34%], if so set the value to a max of 100%
// to ensure a bad cpu data not to mess up the averages
if (fcpu > 100)
{
fcpu = 100;
}
float fmem = mem.NextValue() / 1024 / 1024;
Console.Write(proc.ProcessName + ": " + fcpu + "%" + " | " + fmem + "Mb | ");
// queue is used to store the latest 30 samples (only) for average calculation
// push to the queue (FIFO)
qCPU.Enqueue(fcpu);
qMEM.Enqueue(fmem);
if (qCPU.Count > 30)
{
// pop of the queue (FIFO)
qCPU.Dequeue();
qMEM.Dequeue();
}
// calculate the cpu average
cpuAvg = 0;
foreach (object obj in qCPU)
{
cpuAvg += (float)obj;
//Console.WriteLine("qCPU: " + obj);
}
cpuAvg = cpuAvg / qCPU.Count;
Console.Write("cpuAvg: " + cpuAvg + " | ");
// calculate the memeory average
memAvg = 0;
foreach (object obj in qMEM)
{
memAvg += (float)obj;
//Console.WriteLine("qMEM: " + obj);
}
memAvg = memAvg / qMEM.Count;
Console.Write("memAvg: " + memAvg + " | ");
Console.WriteLine("");
}
// if the cpu average exceeds 90% and memory average exceeds 1GB (hard coded here)
// restart Jrun instance
if (cpuAvg > 90 && memAvg > 1024)
{
//Console.WriteLine("cpuAvg: " + cpuAvg + " | memAvg: " + memAvg);
qCPU.Clear();
qMEM.Clear();
// process is not running, STOP and START the process
processStop(serviceName);
Thread.Sleep(5000);
processStart(serviceName);
}
}
Thread.Sleep(samplingInterval - 1000);
}
}
static void processStop(string serviceName)
{
// stop the process
Console.WriteLine("stopping - " + serviceName);
string cmd = "net stop \"" + serviceName + "\"";
System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo("CMD.exe", "/C " + cmd);
psi.CreateNoWindow = true;
psi.UseShellExecute = false;
System.Diagnostics.Process p = System.Diagnostics.Process.Start(psi);
p.WaitForExit(30000); //wait for 30 sec
int exitCode = p.ExitCode;
Console.WriteLine("exitCode: " + exitCode);
Console.WriteLine("stopped - " + serviceName);
p.Close();
}
static void processStart(string serviceName)
{
// start the process
Console.WriteLine("starting - " + serviceName);
string cmd = "net start \"" + serviceName + "\"";
System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo("CMD.exe", "/C " + cmd);
psi.CreateNoWindow = true;
psi.UseShellExecute = false;
System.Diagnostics.Process p = System.Diagnostics.Process.Start(psi);
p.WaitForExit(30000); //wait for 30 sec
int exitCode = p.ExitCode;
Console.WriteLine("exitCode: " + exitCode);
Console.WriteLine("started - " + serviceName);
p.Close();
}
static void TESTJRunRestart2()
{
Process myProcess = new Process();
ProcessStartInfo myProcessStartInfo = new ProcessStartInfo("C:\\ColdFusion8\\runtime\\bin\\jrun.exe");
//ProcessStartInfo myProcessStartInfo = new ProcessStartInfo("C:\\ColdFusion8\\runtime\\bin\\jrunsvc.exe","-start");
myProcessStartInfo.UseShellExecute = false;
myProcessStartInfo.WindowStyle = ProcessWindowStyle.Minimized;
myProcessStartInfo.Arguments = "-start";
//ProcessStartInfo.RedirectStandardOutput = true;
myProcess.StartInfo = myProcessStartInfo;
myProcess.Start();
Console.WriteLine("started 2");
myProcess.Close();
}
}
}
Ginger CMS
the future of cms, a simple and intuitive content management system ... ASP.NET MVC Application
best practices like Repository, LINQ, Dapper, Domain objects ... CFTurbine
cf prototyping engine, generates boilerplate code and views ... Search Engine LITE
create your own custom search engine for your web site ... JRun monitor
monitors the memory footprint of JRun engine and auto-restarts a hung engine ... Validation Library
complete validation library for your web forms ...
the future of cms, a simple and intuitive content management system ... ASP.NET MVC Application
best practices like Repository, LINQ, Dapper, Domain objects ... CFTurbine
cf prototyping engine, generates boilerplate code and views ... Search Engine LITE
create your own custom search engine for your web site ... JRun monitor
monitors the memory footprint of JRun engine and auto-restarts a hung engine ... Validation Library
complete validation library for your web forms ...