看起来我的谷歌搜索技能很糟糕,我找不到一些问题的答案:
我从C#服务中调用ruby任务。除了服务中的一些东西,以获取信息表格注册表,准备任务等我终于做到了:
m_mProcess.StartInfo = new ProcessStartInfo { FileName = Command, Arguments = Argument, WorkingDirectory = WorkDir, CreateNoWindow = true };
m_mProcess.Start();
Pid = m_mProcess.Id;
文件名是“ruby.exe”。我尝试了很多东西,以便在我停止服务时向已启动的任务发送CTRL-SIGNAL-BREAK(请参阅此处的详细信息导致失败:Start a EXE file from a service and stop it by sending SIGBREAK)。
所以现在我只用Process.GetProcessById(Pid).Kill();
停止这个过程。
这只会带来一个问题。我启动了一个带有ruby任务的瘦服务器,该任务打开并监听tcp端口。当我终止进程时,端口被Windows设计阻止2-3分钟(不确定多长时间 - 并且没有找到禁用此功能)。
到目前为止的前传。现在我的实际问题:)。
我正在考虑使用rubyw.exe
而不是ruby.exe
,然后找到与任务交互的任何方式。我希望可以在不阻塞任何端口的情况下正确关闭/停止rubyw.exe任务。
我已经更改了服务以使用rubyw.exe来测试任何副作用或问题而不是使用ruby.exe(到目前为止还找不到任何副作用)。但是我仍然要杀死这个过程,直到我找到一种方法来关闭正确的过程。
答案 0 :(得分:1)
对于这样的问题,可能有更复杂的解决方案,但我通过管理系统环境变量来处理它。因此,当我启动一个脚本时,我给变量值“运行”,如果我想停止它,我的调用程序将其更改为“停止”。脚本监视变量,当它发现“停止”时如果很好地关闭并且在退出之前将值设置为“已停止”,以便调用程序知道脚本确实已停止。这是一个适用于任何环境和任何语言的解决方案,但当然您需要访问Rubyscripts才能更改它们。