WindowsService调用外部CMD进程

时间:2018-10-09 15:01:36

标签: .net windows-services

我开发了一个称为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,我仍然在等待。

3 个答案:

答案 0 :(得分:0)

服务可以使用服务属性的“恢复”选项卡中的选项重新启动:

enter image description here

当外部可执行文件出错引发异常将终止服务执行,并且“恢复”选项卡中的设置将启动并重新启动服务...

您还可以创建另一个Windows服务,如果External.exe返回代码<> 0,并且您的“ WSP”服务将使用IPC (Interprocess communications)来发出警报,其唯一目的是在发出警报时重新启动“ WSP”服务

答案 1 :(得分:0)

感谢教务长,

我知道如何在出现故障时自动重新启动/恢复服务,但是我不知道这是否是一个好习惯。 就我而言,pr.ExitCode!= 0是可能的结果,我正在对其进行记录。另一方面,我选择不引发新的异常。 我以前是这样想的,但是我对这个方法不满意

答案 2 :(得分:0)

我的最佳猜测是: -进程信息保存在内存中,并且没有正确处理 -您的服务和External.exe都使用的文件已被锁定,因此External.exe失败,因为无法访问它。重新启动服务时,该锁将被释放,从而解决了该问题。