我开发了一个称为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和大公司补给文档。
我接受所有想法,并预先感谢
....
更新,我尝试强制抛出新的异常(如果ExitCode!= 0的情况...)并且令人惊讶的是,WSP仍然有效,并且没有调用重新启动WSP自动重新启动。通过搜索,我发现了很多建议,例如:“创建另一个进程以强制重新启动”; “将CMD KillProcess发送到WSP” ...对我来说,这不是选项。
现在我正在测试另一种方法,我在每次执行完成时都使用WSP.Dispose()(从ServiceBase类继承)。到目前为止,我已经在测试环境中发布了WSP,我仍然在等待。
答案 0 :(得分:0)
服务可以使用服务属性的“恢复”选项卡中的选项重新启动:
当外部可执行文件出错引发异常将终止服务执行,并且“恢复”选项卡中的设置将启动并重新启动服务...
您还可以创建另一个Windows服务,如果External.exe返回代码<> 0,并且您的“ WSP”服务将使用IPC (Interprocess communications)来发出警报,其唯一目的是在发出警报时重新启动“ WSP”服务
答案 1 :(得分:0)
感谢教务长,
我知道如何在出现故障时自动重新启动/恢复服务,但是我不知道这是否是一个好习惯。 就我而言,pr.ExitCode!= 0是可能的结果,我正在对其进行记录。另一方面,我选择不引发新的异常。 我以前是这样想的,但是我对这个方法不满意
答案 2 :(得分:0)
我的最佳猜测是: -进程信息保存在内存中,并且没有正确处理 -您的服务和External.exe都使用的文件已被锁定,因此External.exe失败,因为无法访问它。重新启动服务时,该锁将被释放,从而解决了该问题。