C#/.NET:向父服务报告子进程状态

Posted

技术标签:

【中文标题】C#/.NET:向父服务报告子进程状态【英文标题】:C#/.NET: Reporting subprocess state to the parent service 【发布时间】:2017-01-06 00:08:42 【问题描述】:

我目前有一个运行多个子进程的服务(使用System.Diagnostics.Process)。每个子流程可以运行数小时并处于特定的预定义状态(想想“开始”、“工作”、“清理”等 - 完全预定义,无需报告附加到每个状态的自定义数据)。每个进程不能是单独的 Windows 服务(可能的状态比 Windows 服务状态多)。我需要以某种方式将此状态报告给父服务。所有进程都在同一台 Windows 机器上运行。

我需要能够从其他进程(不是由服务启动的进程)查询子进程状态,并从这些子进程更新父服务关于每个子进程状态的信息。每个进程都有一个唯一的 ID,因此其他进程可以轻松读取状态,而无需自己管理进程。所有进程共享一个配置文件,其中每个子进程都被分配一个唯一的 ID 来标识自己。我曾经想过这样做:

将子进程的标准输出重定向到服务 (RedirectStandardOutput = true),读取输出中的每一行并捕获“特殊”行 (STATECHANGE:state) 每当状态发生变化时,将所有子进程的状态写入预定义位置的文件,并在服务退出时删除该文件。

看来我正在尝试解决一个很久以前就已解决的问题,但我还没有找到该解决方案。有没有“好”的方式来进行这种状态报告?

【问题讨论】:

【参考方案1】:

通常,您正在研究进程间通信或 IPC 领域。

虽然您没有将此问题标记为特定于 Microsoft Windows,但它被标记为 C# 和 .NET,因此您可能在 Windows 环境中运行。我的回答假设您在 MS Windows 中运行此系统。

此类问题的常见解决方案是将状态存储在数据库中。每个服务/进程都可以独立地写入数据库,然后任何对该信息感兴趣的进程都可以查询它。但这不是真正的双向通信。

关于父进程如何与子进程通信,这可以通过多种方式完成,但如果子进程在一个线程上运行某种消息泵并在另一个线程上执行数据处理,这可能是最简单的。消息泵会接收和响应消息,而数据处理线程会做自己的事情。

使用此方案,可以通过多种不同方式交换消息,包括:

Windows 通信框架 (WCF) 命名管道 .NET 远程处理 MS 消息队列 (MSMQ) Windows 剪贴板 动态数据交换 (DDE) 组件对象模型 (COM) 内存映射文件 远程过程调用 (RPC) 套接字

由于所有这些进程都在同一台机器上运行,因此管道是一个简单直接的选择。查看System.IO.Pipes 命名空间

WCF 允许您构建丰富的消息传递接口,该接口可以在管道之上以及其他 IPC 机制之上实现。

在 I'net 上有很多很好的资源来讨论 .NET 上的进程间通信,而不是在这里重新散列,您应该使用诸如“.NET”、“进程间通信”、“IPC”之类的术语来搜索这些资源" 和 "本地机器" (因为你需要本地机器上的进程之间的 IPC)。

【讨论】:

是的,这一切都在 Windows 上运行,我已经编辑了我的问题以澄清这一点。这看起来正是我所需要的,谢谢!

以上是关于C#/.NET:向父服务报告子进程状态的主要内容,如果未能解决你的问题,请参考以下文章

Linux wait函数详解

[APUE]进程控制(中)

UNIX环境高级编程第八章二

使用 pipe() 时,子进程如何向父进程返回两个值?

Linux下异步回收子进程

如何从父进程获取子进程的状态,即它是停止、继续还是退出?对于 Linux,C 语言