首页 > 解决方案 > 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,我还在等待。

标签: .netwindows-services

解决方案


谢谢院长,

我知道如何在失败时自动重启/恢复服务,但我不知道这是否是一个好习惯。就我而言, pr.ExitCode != 0 是可能的结果,我正在记录它。另一方面,我选择不抛出新异常。我以前也想过,但我对这种方法不满意


推荐阅读