.net - WindowsService 调用外部 CMD 进程
问题描述
我开发了一个名为 WSP 的 Windows 服务进程,它正在调用由一家大公司开发的文档不完整的外部控制台应用程序,也称为 External.exe。
我的 WSP 每 2 小时运行一次,没有错误,调用 External.exe 执行完美。有时,我不知道为什么,External.exe 以错误代码 <> 0 结束。正如我之前所说,没有关于它的文档,它是随机的。
问题是:当 External.exe 返回代码 <> 0 时,所有后续对 External.exe 的调用都将失败。
为了解决这个问题,我必须在 Services.msc 中手动重新启动 WSP(是的,我尝试以编程方式重新启动 WSP,而且我现在知道,服务无法自行重新启动)。在此之后,WSP 中的所有步骤都按预期工作。
有没有人遇到过这种问题?
private static bool ExecuteCommandLineTransformProcess(string inputFullPath, string transformerCommandLine)
{
var success = false;
var info = new ProcessStartInfo("cmd.exe", transformerCommandLine);
info.CreateNoWindow = true;
info.WindowStyle = ProcessWindowStyle.Hidden;
info.RedirectStandardOutput = true;
info.UseShellExecute = false;
//Launching External.EXE tool with parameters
using (var pr = Process.Start(info))
{
pr.WaitForExit();
if (pr.HasExited)
{
//pr.ExitCode is the return off external window process, expected 0 when no errorsfound
success = pr.ExitCode == 0;
if (pr.ExitCode != 0)
{
LoggerHelper.Log.Warn($"Transformer - Finished - ##With errors!!! : {pr.ExitCode} .");
//After This Error, all callings to External.Exe will fail silently (not working and ExitCode as 0)
}
LoggerHelper.Log.Info($"Transformer - Finished.");
pr.Refresh();
}
}
return success;
}
我查看了 TaskManager 和 External.Exe 显然没有在后台运行;我尝试了一种强制重启 WSP 的解决方法,但正如我所说,WindowsService 无法自行重启;是的,我在堆栈溢出、Google 和 Big Company Supply Docs 中进行了搜索。
我接受所有想法并提前致谢
……
更新,我试图强制 Throw New 除了 ExitCode != 0 ... 并且令人惊讶的是,WSP 仍然存在并且不调用重新启动 WSP 自动重新启动。对此进行搜索,我发现了很多建议,例如:“创建另一个进程以强制重新启动”;“将 CMD KillProcess 发送到 WSP” ...它们不是我的选择。
现在我正在测试另一种方法,我正在使用 WSP.Dispose() (从 ServiceBase 类继承)每次执行完成。到目前为止,我已经在测试环境中发布了 WSP,我还在等待。
解决方案
谢谢院长,
我知道如何在失败时自动重启/恢复服务,但我不知道这是否是一个好习惯。就我而言, pr.ExitCode != 0 是可能的结果,我正在记录它。另一方面,我选择不抛出新异常。我以前也想过,但我对这种方法不满意
推荐阅读
- java - 抽象类中的公共变量
- angular-elements - 如何在微前端和父容器之间传递变量?
- python - Django 个人资料图像错误地显示登录用户的图像(在每个个人资料上)
- amazon-web-services - 没有在 AWS quicksight 中获取顶部和底部过滤器中的所有行
- javascript - 如何使用 Formik 在页面上有多个提交处理程序?
- java - 如何进一步减小android画中画窗口的大小?
- relationship - Adonis V4 - 如何删除关系
- python - Pycharm:无法上传远程解释器的帮助程序:身份验证失败:可用的身份验证方法已用尽
- python - 为什么我的 python 代码打印“函数”和很多数字?
- javascript - 如何转发 ref 函数声明而不是箭头函数?