【发布时间】:2011-08-01 09:44:09
【问题描述】:
我可能在错误的方向上解决这个问题,所以任何帮助将不胜感激。
我有一个 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 而遇到问题?
提前致谢
【问题讨论】:
-
如果
system("start executable_to_run.exe")阻塞,有些事情搞砸了。start的要点之一是它启动了一个新的、独立的进程。 -
Ruby 1.8.7 不支持 Windows 上的本机线程,因为 Windows 选择不正确实现 POSIX 线程。你知道这一点。完成这项工作的唯一方法是说服 Windows 在
system调用中启动一个独立进程。你需要一个 Windows 而不是一个 Ruby 人来回答这个问题。