如何从Ruby启动和停止一个shell守护进程

8

我该如何在同一个 Ruby 脚本中启动一个 shell 守护进程并停止它?

更具体地说,我想让我的 Ruby 脚本:

  • 使用 shell 命令启动服务器守护进程(如 rails server | shotgun 等)。
  • 在服务器运行时执行一些操作。
  • 使服务器退出。

最好提供适用于 Ruby 1.8/1.9 和 Unix/Windows 的全面解决方案。(例如,据我所知,fork 在 Windows 上无法使用)。


我不确定你的假设,即Kernel::fork在Windows上无法工作,是否正确。我建议你花些时间尝试使用Kernel::exec、Kernel::fork和Kernel::system,并观察它们在你的环境中的行为。 - Jordan Dea-Mattson
Jordan,我不使用Windows。我刚刚偶然发现在Windows上fork的行为与预期不符(例如这里:http://www.ruby-forum.com/topic/215939)。 - Steph Thirion
4个回答

3
我可以强烈推荐Ruby Daemons gem。我认为它具备您所需的所有功能。
请查看其README的第3部分,并特别关注Daemons.call方法,该方法允许将任意代码守护化(您可以在其中只使用Kernel.system一个应用程序)。

@Pavel:嗯,是的,文档的第3部分:“从另一个应用程序控制一堆守护进程”……是的,这部分有一定的守护进程功能,但也可以用于守护其他应用程序! - Peter

0

我无法弄清楚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

要在Rails中使用Daemons gem,您应该使用daemon_generator插件。http://douglasfshearer.com/blog/cron-jobs-in-ruby-on-rails - Douglas F Shearer
谢谢,但我不使用Rails。 - Steph Thirion

0

这里有一个类似的问题,并提供了使用Windows命令行的解决方案:

https://serverfault.com/questions/35305/cmd-exe-how-to-starts-a-background-process-run-some-things-stops-background-pr

这很不干净,但它能解决问题。

如果可以的话,请使用Linux,或者只需使用基本命令行工具(与Git for Windows一起安装)。使用bash,解决方案非常简单:

./script/rails server --pid server.pid &
ruby do_your_stuff.rb
kill `cat server.pid`

顺便说一下,Windows 不是 Rails 推荐的环境。如果你切换到 Linux,你很可能会在长期内节省大量时间,因为你不必解决像这样的奇怪环境问题。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接