如何用 ruby​​ 启动一个完全分离的进程

时间:2021-02-06 22:01:52

标签: ruby-on-rails ruby

就上下文而言,我正在尝试在 rails 环境中运行它。

基本上,我有一个 rails 应用程序,并且在某个控制器#action 上,将使用 ActiveJob 启动一个作业,在该作业中,我想运行我编写的 shell 脚本。

shell 脚本只是将另一个包含 rails 应用程序的存储库克隆到服务器上的不同目录中,安装所有必需的 deps,然后启动服务器

所以,这意味着在某个时候,会有一个父应用和一个子应用(或多个子应用)

这是我的 perform 方法在作业中的样子:

  def perform(resource)
    fork { exec("#{Rails.root.to_s}/my_shell_script.sh #{resource.app_name}") }
  end

这几乎可以工作,但进程并没有分开,因为 fork 继承了父终端。所以子应用程序的 rails 服务器将启动,但是当我转到运行 rails s 的父应用程序的终端窗口时,我不仅看到子应用程序的日志,而且当我用Ctrl-c 孩子的服务器也被杀死了。

我看到两组关闭消息,因为两台服务器都被杀死了。

^C- Gracefully stopping, waiting for requests to finish
- Gracefully stopping, waiting for requests to finish
=== puma shutdown: 2021-02-06 14:47:46 -0700 ===
- Goodbye!
=== puma shutdown: 2021-02-06 14:47:46 -0700 ===
- Goodbye!
Exiting
Exiting

所以我的问题是如何将这些分开?我不想希望在我的服务器日志中看到子应用程序的日志,如果我杀死父应用程序的服务器,我希望子应用程序继续运行。基本上,我希望它们完全分开。

我还尝试了什么

我尝试使用 system 方法,因为它创建了一个子 shell,但它仍然不是一个完全独立的过程。

  def perform(resource)
    fork do
      system("#{Rails.root.to_s}/gensite.sh #{resource.app_name}")
    end
  end

0 个答案:

没有答案
相关问题