获取有关Windows Server中正在运行的进程的信息?

时间:2014-12-12 14:58:23

标签: c# windows process taskmanager

我目前有一个Windows进程,它是由Web上的用户操作启动的。此过程开始时,任务管理器内的进程列表中会显示一个项目。有时我会运行相同进程的三个或四个实例。该流程的每个实例都与作业ID相关联。

我使用推送系统,其中进程本身将在RESTful端点执行其工作时进行ping操作(la heartbeat)。我想改用拉系统。有没有办法让我通过命令行查询Windows任务管理器,并找出每个流程实例对应的作业ID?

我的流程是用C#编写的。

1 个答案:

答案 0 :(得分:0)

实现进程间通信的一种可能方法是使用named pipes

每个作业进程充当命名管道服务器,其名称包括进程ID。服务器在单独的线程中运行,等待客户端连接并将作业ID写入流:

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();

查询作业ID的应用程序将循环遍历所有正在运行的作业进程,连接到它们的管道并从流中读取作业ID:

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));
}