我该如何在同一个 Ruby 脚本中启动一个 shell 守护进程并停止它?
更具体地说,我想让我的 Ruby 脚本:
- 使用 shell 命令启动服务器守护进程(如
rails server
|shotgun
等)。 - 在服务器运行时执行一些操作。
- 使服务器退出。
最好提供适用于 Ruby 1.8/1.9 和 Unix/Windows 的全面解决方案。(例如,据我所知,fork
在 Windows 上无法使用)。
我该如何在同一个 Ruby 脚本中启动一个 shell 守护进程并停止它?
更具体地说,我想让我的 Ruby 脚本:
rails server
| shotgun
等)。最好提供适用于 Ruby 1.8/1.9 和 Unix/Windows 的全面解决方案。(例如,据我所知,fork
在 Windows 上无法使用)。
Kernel.system
一个应用程序)。我无法弄清楚Peter建议的Ruby Daemons gem如何实现我需要的功能,最终我使用了systemu:
# command to start daemon
command = "thin start" # here starting thin server as example
status, stdout, stderr = systemu command do |cid|
# do stuff here
# ...
Process.kill 9, cid # kill the daemon
end
这里有一个类似的问题,并提供了使用Windows命令行的解决方案:
这很不干净,但它能解决问题。
如果可以的话,请使用Linux,或者只需使用基本命令行工具(与Git for Windows一起安装)。使用bash,解决方案非常简单:
./script/rails server --pid server.pid &
ruby do_your_stuff.rb
kill `cat server.pid`
顺便说一下,Windows 不是 Rails 推荐的环境。如果你切换到 Linux,你很可能会在长期内节省大量时间,因为你不必解决像这样的奇怪环境问题。
看一下 Raad gem(Ruby 作为守护进程)https://github.com/colinsurprenant/raad - 它将透明地与 MRI Ruby 和 JRuby 协作。(我是作者)。