从挂起的服务启动进程
本文关键字:启动 进程 服务 挂起 | 更新日期: 2023-09-27 18:18:33
我遇到了一个奇怪的事情,不知道为什么会发生。
我有一个service.exe,我从配置注册表中收集数据,然后启动n个进程。
示例代码:
_mProcess.StartInfo = new ProcessStartInfo
{
FileName = Command,
Arguments = Argument,
WorkingDirectory = WorkDir
};
_mProcess.Start();
Pid = _mProcess.Id;
我的Pid
包含进程id。
现在我添加UseShellExecute = false
来获得StandardOutput。
新的示例代码:
_mProcess.StartInfo = new ProcessStartInfo
{
FileName = Command,
Arguments = Argument,
WorkingDirectory = WorkDir //,
//CreateNoWindow = true,
UseShellExecute = false,
//RedirectStandardOutput = true,
RedirectStandardError = true
//RedirectStandardInput = true
};
_mProcess.Start();
Pid = _mProcess.Id;
using (var reader = _mProcess.StandardError)
{
_logger.ToLog("", Company, reader.ReadToEnd(), "RCluster.log", "service");
}
在这种情况下,进程返回任何错误,我可以存储到我的日志文件。
问题:这段代码是启动一个进程的方法的一部分,我多次调用这个进程(取决于我的配置)。因此,在这段代码中,第一个进程被调用,接下来的进程不被调用。不知何故,服务现在等待第一个服务。我以为这只发生在WaitForExit
。
那么我如何才能得到标准错误输出,但不使进程阻塞我的主要任务继续?
@Gusman:添加你的评论作为答案,你给我带来了正确的答案。那么我可以接受你的意见作为答案。
致反对票:请解释一下原因。
致所有人:我添加了一些代码来启动新进程作为一个线程。在这种情况下,在另一个线程中启动它以获取' standderror消息是有意义的,但不要阻塞主进程(在我的情况下,这是一个启动许多子进程的服务)。
// start as new thread to prevent blocking
var ths = new ThreadStart(() =>
{
mProcess.Start();
Pid = mProcess.Id;
// write pid file
File.WriteAllText(RubyDir + @"'tmp'pids'" + Port + @".pid", Pid.ToString());
using (var reader = mProcess.StandardError)
{
var errorMsg = reader.ReadToEnd();
if (errorMsg.Length > 0) _logger.ToLog("", Company, errorMsg, "SOLR.log", "service");
}
});
var th = new Thread(ths);
th.Start();