.net 正在调用外部CMD进程的WindowsService

jqjz2hbq  于 2022-12-24  发布在  .NET
关注(0)|答案(3)|浏览(107)

我开发了一个名为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不能自行重新启动;是的,我在堆栈溢出、谷歌和大公司供应文档中搜索过。
我接受所有建议并提前表示感谢
...
更新,我试图强制抛出新的,除了在ExitCode!= 0的情况下...和惊喜,WSP仍然活着,不调用重新启动WSP自动重新启动.搜索有关这一点,我发现了很多建议,如:"创建另一个进程以强制此进程重新启动"; "发送CMD KillProcess到WSP"...它们对我来说不是选项。
现在我正在测试另一种方法,我正在使用WSP.Dispose()(它继承自ServiceBase类)完成每个执行。到目前为止,我已经在测试环境中发布了WSP,我仍然在等待。

gfttwv5a

gfttwv5a1#

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

当外部可执行文件错误引发异常,终止服务执行,恢复选项卡中的设置将启动并重新启动服务...
您还可以创建另一个Windows服务,如果External.exe返回代码〈〉0,则您的“WSP”服务将使用IPC (Interprocess communications)发出警报,其唯一目的是在收到警报时重新启动“WSP”服务。

ndasle7k

ndasle7k2#

我最好的猜测是:- 进程信息保留在内存中,未正确释放-服务和External.exe同时使用的文件被锁定,因此External.exe因无法访问而失败。重新启动服务时,锁定将被释放,从而修复了此问题。

kpbwa7wx

kpbwa7wx3#

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

相关问题