【发布时间】:2020-10-07 19:46:21
【问题描述】:
我想在服务器启动时启动一个 ngrok 进程。为此,我编写了一个 ngrok.rb 库并在初始化程序中调用它
app/lib/ngrok.rb
require "singleton"
class Ngrok
include Singleton
attr_accessor :api_url, :front_url
def start
if is_running?
return fetch_urls
end
authenticate
started = system("ngrok start --all -log=stdout > #{ENV['APP_ROOT']}/log/ngrok.log &")
system("sleep 1")
if !started
return { api: nil, front: nil }
end
urls = fetch_urls
sync_urls(urls["api_url"], urls["front_url"])
return urls
end
def sync_urls(api_url, front_url)
NgrokSyncJob.perform_later(api_url, front_url)
end
def is_running?
return system("ps aux | grep ngrok")
end
def restart
stop
return start
end
def stop
return system("pkill ngrok")
end
def authenticate
has_file = system("ls ~/.ngrok2/ngrok.yml")
if has_file
return true
else
file_created = system("ngrok authtoken #{ENV['NGROK_TOKEN']}")
if file_created
return system("cat " + ENV['APP_ROOT'] + '/essentials/ngrok/example.yml >> ~/.ngrok2/ngrok.yml')
else
return false
end
end
end
def fetch_urls
logfile = ENV['APP_ROOT'] + '/log/ngrok.log'
file = File.open logfile
text = file.read
api_url = nil
front_url = nil
text.split("\n").each do |line|
next if !line.include?("url=") || !line.include?("https")
if line.split("name=")[1].split(" addr=")[0] == "ncommerce-api"
api_url = line.split("url=")[1]
elsif line.split("name=")[1].split(" addr=")[0] == "ncommerce"
front_url = line.split("url=")[1]
end
end
file.close
self.api_url = api_url
self.front_url = front_url
res = {}
res["api_url"] = api_url
res["front_url"] = front_url
return res
end
end
config/initializers/app-init.rb
module AppModule
class Application < Rails::Application
config.after_initialize do
puts "XXXXXXXXXXXXXXXXXXXXXXX"
Ngrok.instance.start
puts "XXXXXXXXXXXXXXXXXXXXXXX"
end
end
end
当我输入 rails serve 时,这里是输出示例
所以我们肯定知道我的初始化程序正在被调用,但是当我查看 Rails 控制台是否正在运行时,不是!
但是当我在 rails 控制台输入Ngrok.instance.start 时,输出如下:
它开始了!
所以,我的问题是:为什么在地球上system("ngrok start --all -log=stdout > #{ENV['APP_ROOT']}/log/ngrok.log &") 不在 rails serve 上工作,但它在 rails 控制台上?
更新
如果我在 ngrok.rb 中使用 'byebug' 并使用 rails serve,当我使用 "continue" 退出 byebug 时,ngrok 进程会创建并运行
【问题讨论】:
-
放置断点时它可以工作的事实让我认为这是异步进程之间的时间问题。乱七八糟地增加一些睡眠,看看是否会改变什么
-
@maxpleaner 确定。那正是我所想。我在无数个地方睡了无数次!我仍然认为这不是问题,因为 Ngrok.instance.start 在 rails c 但不在 rails s 中工作,无论内部睡眠如何
-
您是在 macOS 还是 Linux 上运行?
-
您没有任何错误检查。使用
exception: true或 child_process 或手动 fork+exec 进行错误检查。 -
@kisch 我正在运行 Linux,Ubuntu 20
标签: ruby-on-rails ruby ruby-on-rails-6