在Ruby中生成一个独立的线程或进程

时间:2011-04-08 10:11:48

标签: ruby windows ruby-1.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?

提前致谢

2 个答案:

答案 0 :(得分:4)

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

pid = spawn 'some_executable'
Process.detach(pid) #tell the OS we're not interested in the exit status

答案 1 :(得分:3)

我刚刚尝试过,start不会在使用Ruby 1.8.7的Windows 7 x64上阻止。

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

这显然是针对Windows的。