Exemple #1
0
 private void CheckTimeout()
 {
     foreach (var checker in streamTimeoutCheckers.Values.ToArray())
     {
         StandardOutput.OnNext($"[{nameof(CheckTimeout)}]{checker.StreamName}: {checker.Stopwatch.Elapsed.TotalSeconds.ToString("0.00")}");
         if (checker.Stopwatch.Elapsed.TotalSeconds > checker.Timeout)
         {
             OnExit(checker.StreamName, 408);
             break;
         }
     }
 }
Exemple #2
0
        public void BeginWatch()
        {
            KillProcesses();
            StandardOutput.OnNext($"[{nameof(BeginWatch)}] Starting Processes.");
            var executors = processControlOptions.ProcessesToStart.Select(monitorOptions =>
            {
                ProcessExecutor processExecutor = new ProcessExecutor(monitorOptions.ProcessPath.PopulateKeys());
                processExecutor.AddArguments(monitorOptions.Arguments.Select(argument => argument.PopulateKeys()));
                return(new
                {
                    processExecutor,
                    monitorOptions
                });
            }).ToArray();

            foreach (var executor in executors)
            {
                Subscriptions.Add(executor.processExecutor.StandardOutput
                                  .Subscribe((string value) =>
                {
                    if (executor.monitorOptions.HeartBeatKeys.Any(key => !string.IsNullOrEmpty(value) && value.Contains(key)))
                    {
                        // heart beat is consumed internally
                        streamTimeoutCheckers[executor.monitorOptions.StreamName].Stopwatch.Restart();
                    }
                    else
                    {
                        streamTimeoutCheckers[executor.monitorOptions.StreamName].Stopwatch.Restart();
                        StandardOutput.OnNext($"{executor.monitorOptions.StreamName}: {value}");
                    }
                }));
                Subscriptions.Add(executor.processExecutor.StandardError
                                  .Subscribe((string value) =>
                {
                    streamTimeoutCheckers[executor.monitorOptions.StreamName].Stopwatch.Restart();
                    StandardError.OnNext($"{executor.monitorOptions.StreamName}: {value}");
                }));
                Subscriptions.Add(executor.processExecutor.OnExit.Subscribe((int code) => OnExit(executor.monitorOptions.StreamName, code)));
                processExecutors.Add(executor.processExecutor);
                StreamTimeoutChecker checker = new StreamTimeoutChecker()
                {
                    StreamName = executor.monitorOptions.StreamName,
                    Timeout    = executor.monitorOptions.Timeout,
                    Stopwatch  = new Stopwatch()
                };
                checker.Stopwatch.Start();
                streamTimeoutCheckers.Add(checker.StreamName, checker);
                executor.processExecutor.ExecuteAsync();
            }
            StandardOutput.OnNext($"[{nameof(BeginWatch)}] {executors.Length} Processes Started.");
        }
Exemple #3
0
 public void OnExit(string streamName, int exitCode)
 {
     StandardError.OnNext($"[{nameof(OnExit)}] Process '{streamName}' exited with Code {exitCode};");
     StandardOutput.OnNext($"[{nameof(OnExit)}] Kill Processes");
     streamTimeoutCheckers.Clear();
     Subscriptions.ForEach(x => x.Dispose());
     Subscriptions.Clear();
     processExecutors.ForEach(p => p.TryKill());
     StandardOutput.OnNext($"[{nameof(OnExit)}] {processControlOptions.Retry} Retries Remaining.");
     processControlOptions.Retry--;
     if (processControlOptions.Retry >= 0)
     {
         StandardOutput.OnNext($"[{nameof(OnExit)}] Retry now.");
         BeginWatch();
     }
     else
     {
         KillProcesses();
         JobCompleted = 1;
     }
 }
Exemple #4
0
        public void KillProcesses()
        {
            if (processControlOptions.ProcessesToKillOnError == null)
            {
                return;
            }
            StandardOutput.OnNext($"[{nameof(KillProcesses)}] Search for Conflicting Processes.");
            Dictionary <int, Process> processDict = new Dictionary <int, Process>();

            foreach (var processName in processControlOptions.ProcessesToKillOnError)
            {
                var found = Process.GetProcessesByName(processName);
                if (found.Any())
                {
                    foreach (var process in found)
                    {
                        if (!processDict.ContainsKey(process.Id))
                        {
                            processDict.Add(process.Id, process);
                        }
                    }
                }
            }
            StandardOutput.OnNext($"[{nameof(KillProcesses)}] {processDict.Count} Processes Found: {string.Join(", ", processDict.Values.Select(p => p.ProcessName))}");
            foreach (var process in processDict.Values)
            {
                try
                {
                    if (!process.HasExited)
                    {
                        process.Kill();
                    }
                }
                catch (Exception ex) { }
            }
        }