2014-12-12 3 views
0

В настоящее время у меня есть процесс Windows, который запускается пользовательским действием в Интернете. Когда этот процесс начинается, элемент появляется в списке процессов внутри диспетчера задач. Иногда у меня будет три или четыре экземпляра одного и того же процесса. Каждый из экземпляров процесса связан с идентификатором задания.Получение информации о текущем процессе в Windows Server?

Я использую систему push, в которой сам процесс будет пинговать конечную точку RESTful, пока он выполняет свою работу (a la heartbeat). Вместо этого я хотел бы использовать систему pull. Есть ли способ обратиться к диспетчеру задач Windows через командную строку и узнать, какой идентификатор задания соответствует каждому из моих экземпляров процесса?

Мой процесс написан на C#.

ответ

0

Одним из возможных способов реализации межпроцессного взаимодействия является использование named pipes.

Каждый процесс работы выполняет роль сервера именованных каналов с именем, включающим идентификатор процесса. Сервер, запускается в отдельном потоке, ожидает подключения клиента и записывает идентификатор задания в поток:

var jobId = Guid.NewGuid(); 
var jobIdBytes = jobId.ToByteArray(); 
var pid = Process.GetCurrentProcess().Id; 
var pipeName = "pipe" + pid; 
var running = true; 

new Thread(() => 
{ 
    using (var pipeServer = new NamedPipeServerStream(pipeName)) 
    { 
     while (running) 
     { 
      pipeServer.WaitForConnection(); 
      pipeServer.Write(jobIdBytes, 0, jobIdBytes.Length); 
      pipeServer.Disconnect(); 
     } 
    } 

}).Start(); 

приложение для запроса идентификаторов заданий будет перебрать все запущенные процессы работы, подключение к их трубам и читать идентификатор работы от потока:

var jobIdBytes = new byte[16]; 

foreach (var process in Process.GetProcessesByName("jobProcessName")) 
{ 
    var pipeName = "pipe" + process.Id; 

    using (var clientStream = new NamedPipeClientStream(pipeName)) 
    { 
     clientStream.Connect(); 
     clientStream.Read(jobIdBytes, 0, jobIdBytes.Length); 
    } 

    var jobId = new Guid(jobIdBytes); 
    Console.WriteLine(String.Format("pid: {0}, job_id: {1}", process.Id, jobId)); 
} 
Смежные вопросы