package dk.kaspergsm.stormdeploy.image;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Timer;
import java.util.TimerTask;
/**
* Is used to monitor a process, and restart as necessary.
*
* Can be executed by:
* java -cp storm-deploy-alternative.jar dk.kaspergsm.stormdeploy.image.ProcessMonitor
*
* @author Kasper Grud Skat Madsen
*/
public class ProcessMonitor {
private static long _daemonStartTime = 300000; // 5 minutes in milliseconds
private static long _startDaemonTs;
private static String[] _toExec;
private static String _process;
private static Timer t;
private ProcessMonitor() {
}
public static void main(String[] args) {
// Expected args
// 1. Process id to check
// 2. Executable string
if (args.length <= 1) {
System.err.println("Wrong number of arguments given. Please provide process id and executable string");
return;
}
// Parse
_process = args[0].replaceAll("\"", "");
_toExec = new String[args.length - 1];
for (int i = 1; i < args.length; i++)
_toExec[i-1] = args[i].replaceAll("\"", "");
// Schedule work
t = new Timer();
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
try {
if (!isRunning()) {
Runtime.getRuntime().exec(_toExec);
_startDaemonTs = System.currentTimeMillis();
}
} catch (Exception ex) {
System.err.println(ex.toString());
}
}
}, 1000, 5000);
}
private static boolean isRunning() throws IOException {
Runtime rt = Runtime.getRuntime();
Process p = rt.exec(new String[]{"ps","aux"});
BufferedReader i = new BufferedReader(new InputStreamReader(p.getInputStream()));
// read the output from the command
String s;
while ((s = i.readLine()) != null) {
if (s.contains(_process) && !s.contains("storm-deploy-alternative.jar")) // filter the monitoring process
return true;
}
// Only if more than _initialStartup has passed, return false
// It is imperative the daemons gets enough time to start!
long passedTimeSinceDaemonLaunch = System.currentTimeMillis() - _startDaemonTs;
if (passedTimeSinceDaemonLaunch >= _daemonStartTime)
return false;
return true;
}
}