Нужно убить процес через C#

bedl0

Client
Регистрация
07.12.2012
Сообщения
244
Благодарностей
56
Баллы
28
Собственно возникла задача убить определённый процесс, если потребляемое им количество памяти превысило заданное значение. Помогите как реализовать такое через сниппет на C#. По логике это должно выглядеть примерно так: берем процесс, проверяем сколько им потребляется памяти, если больше значения переменной то убиваем процесс и идем к следующему процессу (их может быть несколько), если все ок то ложимся спать минут на 10 ну или что вроде этого.
 
  • Спасибо
Реакции: Sergodjan

darkdiver

Administrator
Команда форума
Регистрация
13.01.2009
Сообщения
2 285
Благодарностей
2 731
Баллы
113
Код:
// берем все процессы блокнота
var procs = System.Diagnostics.Process.GetProcessesByName("notepad");
foreach (var proc in procs)
{
    // если потребили больше 10 Мб, то убиваем
    if (proc.WorkingSet > 10000000)
        proc.Kill();
}
 

bedl0

Client
Регистрация
07.12.2012
Сообщения
244
Благодарностей
56
Баллы
28
Спасибо работает, помогает убить потёкший инстанс )
 
  • Спасибо
Реакции: Sergodjan

zennoX

Client
Регистрация
05.04.2014
Сообщения
484
Благодарностей
134
Баллы
43
как убить все base.exe? Подскажите плз, в диспетчере заданий хочу в конце каждого круга убивать базы.


 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 125
Баллы
113
как убить все base.exe? Подскажите плз, в диспетчере заданий хочу в конце каждого круга убивать базы.
C#:
var procs = System.Diagnostics.Process.GetProcessesByName("base");
foreach (var proc in procs)
    proc.Kill();
 

zennoX

Client
Регистрация
05.04.2014
Сообщения
484
Благодарностей
134
Баллы
43
C#:
var procs = System.Diagnostics.Process.GetProcessesByName("base");
foreach (var proc in procs)
    proc.Kill();
а можно как то процесс базы текущего шаба (который убивает процессы) убить крайним?
Иначе, если он убьет свой процесс, то остальные не убьет)
 

enfox

Новичок
Регистрация
12.09.2015
Сообщения
5
Благодарностей
1
Баллы
3
Всем привет. Подскажите пожалуйста, я запускаю процесс (cmd.exe через батник) и вывожу process.Id:
Код:
var path = project.Variables["path"].Value;
var process = System.Diagnostics.Process.Start(path);
// возвращаем Id запущенного процесса
return process.Id;
Потом cmd.exe запускает другой процесс (python.exe). Подскажите пожалуйста как можно найти ID этого процесса python.exe, чтобы потом я смог закрыть его. Способ по имени python не катит, т.к. будет несколько процессов python, нужно закрыть именно по ID.
 

enfox

Новичок
Регистрация
12.09.2015
Сообщения
5
Благодарностей
1
Баллы
3
На одном из форумов нашел код, который ищет всех потомков запущенного процесса. Т.е. по родительскому процессу ProcessID, находится childId. Подскажите пожалуйста как его адаптировать под zenno, в таком виде у меня он не выполняется?
Код:
using System;
using System.Diagnostics;
using System.Management;

namespace ConsoleApplication1
{

    class Program
    {
        static void Main(string[] args)
        {
            var cmdProcess = Process.Start("cmd");
            Console.ReadLine();

            var query = string.Format("SELECT ProcessId FROM Win32_Process WHERE ParentProcessId = {0}", cmdProcess.Id);
            var search = new ManagementObjectSearcher("root\\CIMV2", query);

            foreach (var childResult in search.Get())
            {
                var childId = (uint)childResult["ProcessID"];
                var child = Process.GetProcessById((int)childId);

                Console.WriteLine(child.Id + "\t" + child.MainWindowTitle);
            }
        }
    }
}
 

kapelan28

Client
Регистрация
22.09.2015
Сообщения
469
Благодарностей
186
Баллы
43
На одном из форумов нашел код, который ищет всех потомков запущенного процесса. Т.е. по родительскому процессу ProcessID, находится childId. Подскажите пожалуйста как его адаптировать под zenno, в таком виде у меня он не выполняется?
Такой вариант попробуйте
Код:
ZennoPoster.StopTask(Guid.Parse(project.TaskId));
Запускать по Bad end или Good end на ваше усмотрение.
Upd. что-то тему не глянул полностью перед ответом - этот вариант кода применим ко всем потокам одного запущенного шаблона.
 

enfox

Новичок
Регистрация
12.09.2015
Сообщения
5
Благодарностей
1
Баллы
3
Такой вариант попробуйте
Код:
ZennoPoster.StopTask(Guid.Parse(project.TaskId));
Запускать по Bad end или Good end на ваше усмотрение.
Upd. что-то тему не глянул полностью перед ответом - этот вариант кода применим ко всем потокам одного запущенного шаблона.
Да, такой вариант не подходит. Это прерывает работу проекта, но процессы не прерываются. У кого-то ещё есть идеи как по известному ProcessID найти childId? Чувствую где-то близко решение, но что-то неправильно видно делаю.
 

catol

Client
Регистрация
05.07.2012
Сообщения
278
Благодарностей
98
Баллы
28
А есть рабочий вариант если, процесс работал более 300 сек то его убить. Есть готовое условие?
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 179
Благодарностей
2 187
Баллы
113
А есть рабочий вариант если, процесс работал более 300 сек то его убить. Есть готовое условие?
C#:
// берем все процесс, я взял для примера вайбер
var procs = System.Diagnostics.Process.GetProcessesByName("viber");
if (procs.Count() == 0)
{
    return "не нашли нужного процесса";
}
else
{
    foreach (var proc in procs)
    {
        DateTime StartTime = proc.StartTime;
        TimeSpan Time_diff = DateTime.Now - StartTime;
        int Time_diff_int = Convert.ToInt32(Time_diff.TotalMinutes); //вернет время работы процесса в минутах
        // ставим проверку времени на 5 минут:
        if (Time_diff_int>5)
        {
            proc.Kill();
            project.SendInfoToLog("убили процесс");
        }
        else
        {
            project.SendInfoToLog("НЕ убили процесс, а то его время работы столько минут: " + Time_diff_int);
        }
    }
}
 
Последнее редактирование:
  • Спасибо
Реакции: catol и djaga

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)