1

看来我的谷歌搜索技能太差了,我找不到一些问题的答案:

我从 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(请参阅此处导致失败的更多详细信息:从服务启动 EXE 文件并通过发送停止它信号中断)。

所以现在我只是用Process.GetProcessById(Pid).Kill();.

这只会带来一个问题。我使用 ruby​​ 任务启动了一个瘦服务器,该任务打开并侦听 tcp 端口。当我终止进程时,端口被 Windows 设计阻止了 2-3 分钟(不确定到底有多长时间 - 并且没有发现禁用此功能)。

前传到此为止。现在到我的实际问题:)。

我正在考虑使用rubyw.exe而不是ruby.exe找到与任务交互的任何方式。我希望可以在不阻塞任何端口的情况下正确关闭/停止 ruby​​w.exe 任务。我已经将服务更改为从 ruby​​w.exe 开始以测试任何副作用或问题,而不是使用 ruby​​.exe(到目前为止还找不到)。但是我仍然必须终止该进程,直到找到正确关闭该进程的方法。

4

1 回答 1

1

对于这样的问题,可能有更复杂的解决方案,但我通过管理系统环境变量来简单地处理它。所以当我启动一个脚本时,我给变量值“运行”,如果我想停止它,我的调用程序将它更改为“停止”。脚本监视变量,当它找到一个“停止”时,如果很好地关闭并且就在退出之前将值设置为“停止”,以便调用程序知道脚本确实停止了。这是一个适用于任何环境和任何语言的解决方案,但当然您需要访问 Rubyscripts 来更改它们。

于 2012-08-08T07:40:52.717 回答