C#/.NET:向父服务报告子进程状态
C#/.NET: Reporting subprocess state to the parent service
我目前有一个服务 运行 有几个子进程(System.Diagnostics.Process
)。每个子流程可以 运行 数小时并处于特定的预定义状态(想想 "starting"、"working"、"cleaning up" 等 - 完全预定义,每个状态都没有附加自定义数据必须申报)。每个进程不能是单独的 Windows 服务(可能的状态比 Windows 服务状态多)。我需要以某种方式将此状态报告给父服务。所有进程 运行 都在同一台 Windows 机器上。
我需要能够从其他进程(不是由服务启动的进程)查询子进程状态,并从这些子进程更新有关每个子进程状态的父服务。每个进程都有一个唯一的 ID,因此其他进程可以轻松读取状态,而无需自己管理进程。所有进程共享一个配置文件,其中每个子进程都被分配了一个唯一的 ID 来标识自己。我考虑过这样做:
- 将子进程的标准输出重定向到服务 (
RedirectStandardOutput = true
),读取输出中的每一行并捕获 "special" 行 (STATECHANGE:state
)
- 每当状态发生变化时,将所有子进程的状态写到预定义位置的文件中,并在服务退出时删除该文件。
看来我正在尝试为很久以前解决的问题找到解决方案,但我还没有找到该解决方案。有什么 "nice" 方法可以进行这种状态报告吗?
一般来说,您正在深入研究进程间通信或 IPC 领域。
虽然您没有将此问题标记为特定于 Microsoft Windows,但它被标记为 C# 和 .NET,因此您可能 运行 在 Windows 环境。我的回答假设你 运行 这个系统在 MS Windows.
解决此类问题的常见方法是在数据库中存储状态。每个 service/process 都可以独立地写入数据库,然后任何对该信息感兴趣的进程都可以查询它。但这不是真正的双向通信。
关于父进程如何与子进程通信,这可以通过多种方式完成,但如果子进程 运行 在线程上执行某种消息泵并执行,这可能是最简单的在另一个线程上处理数据。消息泵将接收和响应消息,而数据处理线程将完成它的工作。
使用此方案,可以通过多种不同方式交换消息,包括:
- Windows 通信框架 (WCF)
- 命名管道
- .NET 远程处理
- MS 消息队列 (MSMQ)
- Windows剪贴板
- 动态数据交换 (DDE)
- 组件对象模型 (COM)
- 内存映射文件
- 远程过程调用 (RPC)
- 套接字
由于所有这些进程都 运行 在同一台机器上,管道是一个简单直接的选择。查看 System.IO.Pipes
命名空间
WCF 允许您构建丰富的消息传递接口,该接口可以在管道以及其他 IPC 机制之上实现。
I'net 上有很多讨论 .NET 上的进程间通信的好资源,与其在这里重复这些内容,不如使用“.NET”等术语搜索这些资源,"interprocess communications" ,"IPC" 和 "local machine"(因为您需要在本地计算机上的进程之间进行 IPC)。
我目前有一个服务 运行 有几个子进程(System.Diagnostics.Process
)。每个子流程可以 运行 数小时并处于特定的预定义状态(想想 "starting"、"working"、"cleaning up" 等 - 完全预定义,每个状态都没有附加自定义数据必须申报)。每个进程不能是单独的 Windows 服务(可能的状态比 Windows 服务状态多)。我需要以某种方式将此状态报告给父服务。所有进程 运行 都在同一台 Windows 机器上。
我需要能够从其他进程(不是由服务启动的进程)查询子进程状态,并从这些子进程更新有关每个子进程状态的父服务。每个进程都有一个唯一的 ID,因此其他进程可以轻松读取状态,而无需自己管理进程。所有进程共享一个配置文件,其中每个子进程都被分配了一个唯一的 ID 来标识自己。我考虑过这样做:
- 将子进程的标准输出重定向到服务 (
RedirectStandardOutput = true
),读取输出中的每一行并捕获 "special" 行 (STATECHANGE:state
) - 每当状态发生变化时,将所有子进程的状态写到预定义位置的文件中,并在服务退出时删除该文件。
看来我正在尝试为很久以前解决的问题找到解决方案,但我还没有找到该解决方案。有什么 "nice" 方法可以进行这种状态报告吗?
一般来说,您正在深入研究进程间通信或 IPC 领域。
虽然您没有将此问题标记为特定于 Microsoft Windows,但它被标记为 C# 和 .NET,因此您可能 运行 在 Windows 环境。我的回答假设你 运行 这个系统在 MS Windows.
解决此类问题的常见方法是在数据库中存储状态。每个 service/process 都可以独立地写入数据库,然后任何对该信息感兴趣的进程都可以查询它。但这不是真正的双向通信。
关于父进程如何与子进程通信,这可以通过多种方式完成,但如果子进程 运行 在线程上执行某种消息泵并执行,这可能是最简单的在另一个线程上处理数据。消息泵将接收和响应消息,而数据处理线程将完成它的工作。
使用此方案,可以通过多种不同方式交换消息,包括:
- Windows 通信框架 (WCF)
- 命名管道
- .NET 远程处理
- MS 消息队列 (MSMQ)
- Windows剪贴板
- 动态数据交换 (DDE)
- 组件对象模型 (COM)
- 内存映射文件
- 远程过程调用 (RPC)
- 套接字
由于所有这些进程都 运行 在同一台机器上,管道是一个简单直接的选择。查看 System.IO.Pipes
命名空间
WCF 允许您构建丰富的消息传递接口,该接口可以在管道以及其他 IPC 机制之上实现。
I'net 上有很多讨论 .NET 上的进程间通信的好资源,与其在这里重复这些内容,不如使用“.NET”等术语搜索这些资源,"interprocess communications" ,"IPC" 和 "local machine"(因为您需要在本地计算机上的进程之间进行 IPC)。