当前位置: 首页 > 编程语言 > C#

从一个服务启动一个EXE文件并通过发送SIGBREAK来停止它share

时间:2023-04-11 00:08:10 C#

从一个服务启动一个EXE文件并通过发送一个SIGBREAK来停止我写了一个启动java.exe或ruby.exe的服务(我知道有一些变通方案,但出于某种原因我需要自己的服务)。该服务目前有效,我从注册表中收集我的配置,然后启动该服务。当服务停止时,我得到我的进程并发送一个.Kill()。到目前为止,一切都很好。但我发现,.kill()是一个问题,因为ruby??.exe(我用thin来启动服务)或java.exe(我用它来启动SOLR)监听tcp套接字端口。如果使用此端口并且我终止进程窗口将阻塞端口72秒(按设计)。如果我执行solr:startfromshell命令shell并启动thin-start并使用Ctrl+C停止它,进程终止并且端口立即可用。所以我的猜测是:如果我设法向进程发送ctrl-c,它就会正确终止。所以我找到了这篇文章Howtorunanexefromanexeserviceandstoptheservicewhentheexeprocessexits?发布概念证书的地方。但是通过从窗口服务启动进程,我没有windowHandle。我这样启动服务:m_process.StartInfo=newProcessStartInfo{FileName="java",Arguments=arguments,UseShellExecute=true,WorkingDirectory=workDirectory,CreateNoWindow=false};m_process.Start();如果参数包含启动SOLR的jetty数据或者在ruby??情况下我使用“ruby.exethinstart...”。现在停止我尝试的服务:[DllImport("user32.dll",CharSet=CharSet.Auto)]publicstaticexternIntPtrFindWindow(stringlpClassName,stringlpWindowName);[DllImport("user32")]publicstaticexternintSetForegroundWindow(IntPtrhwnd);[DllImport("user32.dll",SetLastError=true)]publicstaticexternvoidSwitchToThisWindow(IntPtrhWnd,boolfAltTab);foreach(intiinm_processList){MyLogEvent(Process.GetProcessById(i).MainModule.ModuleName);MyLogEvent(Process.GetProcessById(i).MainWindowTitle);尝试{IntPtrptr=FindWindow(null,Process.GetProcessById(i).MainWindowTitle);{SetForegroundWindow(ptr);线程.睡眠(1000);InputSimulator.SimulateModifiedKeyString(VirtualKeyCode.CONTROL,VirtualKeyCode.CANCEL);//SendKeys.Send("^{BREAK}");线程.睡眠(1000);}//Process.GetProcessById(i).Kill();}catch(Exceptionex){MyLogEvent(ex.ToString());Process.GetProcessById(i).Kill();但是由于我没有WindowTitle,我想我什至没有窗口我无法分配这样的进程。那么有人知道如何分叉进程并向其发送停止信号吗?我可以忍受只是终止进程,但这只是服务重新启动而不等待很长时间是不可能的。感谢您提供任何提示、技巧和解决方案。GenerateConsoleCtrlEvent可能会起作用varprocess=m_process.Start();当killchildappC…GenerateCTRL_C_EVENT,process.Id);会员声明以上为C#学习教程:从服务启动EXE文件,发送SIGBREAK停止,分享所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家喜欢关注—publicconstUInt32CTRL_C_EVENT=0;[DllImport("kernel32.dll")][返回:MarshalAs(UnmanagedType.Bool)]staticexternboolGenerateConsoleCtrlEvent(uintdwCtrlEvent,uintdwProcessGroupId);如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: