8

我可能在错误的方向上接近这个,所以任何帮助将不胜感激。

我有一个 Ruby 脚本,除其他外,它启动了一个可执行文件。我想启动这个可执行文件——目前正在使用系统“”触发——然后继续执行脚本。当脚本完成时,我希望它退出但让可执行文件保持运行。

最初我有以下

# Do some work
# Start the executable
system("executable_to_run.exe")

# Continue working

但是executable_to_run.exe是一个阻塞的可执行文件,并且系统“”在可执行文件完成运行之前不会退出(我不希望它这样做)

所以我现在有这样的东西(大幅削减)

# Do some work
# Start the executable on it's one thread
Thread.new do
  system("executable_to_run.exe")
end

# Continue working

这很好,因为我的脚本可以在线程在后台运行可执行文件时继续运行。不幸的是,当我的脚本退出时,可执行线程仍在运行,并且在线程可以退出之前它不会退出。如果我杀死可执行文件,线程退出并且脚本退出。

所以我需要做的是触发“executable_to_run.exe”并让它在后台运行。

我在 Windows 上使用 Ruby 1.8.7,这意味着未实现 fork。我无法升级到 1.9,因为我需要首先解决内部和外部团队依赖项(并且不会很快完成)。

我试过了

  • 通过“开始”命令运行该过程,但这仍然会阻塞
  • 在可执行线程上调用 Thread.kill 但它仍然需要杀死可执行文件

那么这是我可以在 Ruby 中做的事情,我只是错过了一些东西,还是因为我不能使用 Fork 而遇到问题?

提前致谢

4

2 回答 2

4

detunized 的答案应该适用于 Windows。这是跨平台的:

pid = spawn 'some_executable'
Process.detach(pid) #tell the OS we're not interested in the exit status
于 2011-04-08T10:55:03.707 回答
3

我刚刚尝试过并start没有在带有 Ruby 1.8.7 的 Windows 7 x64 上阻塞。

system 'start notepad'
puts 'Exiting now...'

这显然是特定于 Windows 的。

于 2011-04-08T10:19:45.500 回答