ruby - 用于在独立线程中运行服务器然后在任务完成时终止线程的 Rake 任务?

标签 ruby multithreading rakefile

如何在 rake 任务 中启动一个线程,然后在任务完成时终止线程。

本质上,我正在编写一个 rake 任务 来测试一个 jekyll 站点。我希望能够启动服务器,执行一些其他任务,然后在任务完成时销毁线程。这是我到目前为止所拥有的:

task :test_site do
  `ejekyll --server`
  `git -Xdn`
  if agree( "Clean all ignored files?")
    git -Xdf
  end
end

但不幸的是,我知道停止 jekyll --server 的唯一方法是使用 ctrl c。我很高兴听到在庄园中停止 jekyll --server 的方法,它不会退出 rake 任务,但请发表评论,因为这个问题专门询问线程和 rake 任务。

最佳答案

你想要Process.spawn不是一个线程。它是一个新进程,而不是现有进程中的执行线程。你得到了 PID,所以只需发送 Process.kill(:QUIT, pid)或者你想用什么方法来杀死生成的处理。

pid = Process.spawn(
  "ejekyll", "--server",
  out: "/dev/null",
  err: "/dev/null"
)

# you may need to add a short sleep() here

# other stuff

Process.kill(:QUIT, pid) && Process.wait

如果 ejekyll 有一个在前台运行的命令行选项,最好使用它,否则如果它 self 守护,你需要知道它存储 PID 文件的位置,以便识别并杀死守护进程。

关于ruby - 用于在独立线程中运行服务器然后在任务完成时终止线程的 Rake 任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10454699/

相关文章:

ruby-on-rails - RoR : named_scope, 最近 7 天内创建的所有记录?

ruby - 将 Hashmap 放入自身会导致奇怪的行为

c# - 我在线程方面做错了什么?

ruby - 如何在 rake 任务的字符串参数中使用逗号?

ruby - rake 使用 -m 两次调用任务

ruby - Redis-rb 将哈希插入列表

ruby - RSpec allow/expect 与 just expect/and_return

c# - Threading.Monitor - 多个锁定对象与 PulseAll - 哪个资源效率更高?

Java多线程程序(生产者和消费者)挂起..?

ruby - 使用 rake 复制保留目录结构的文件