就上下文而言,我正在尝试在 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