如何使用Sinatra作为服务运行Ruby应用程序



我知道这个问题已经被问了很多次,我读过每一个问答;关于这个问题,我还是很困惑。

我是一个Ruby迷,试图让(别人)用Sinatra和Strava构建的Ruby应用程序在Linux中作为服务运行。它是一个网关,用于处理与github同步Transifex语言翻译。我已经对原始代码进行了分叉,并修复了一些错误,现在它工作得很好。我的回购在这里:

https://github.com/Fabrik/txgh

最初的文档只展示了如何使用"bundle-exec-rackup"从命令行运行它。我试着通过简单地从rc.local备份bundle命令来实现守护进程,但这不起作用。我对使用bundle并不虔诚,因为它是在一个专用的小型亚马逊ECS实例上运行的,我不会在上面安装任何其他Ruby,所以没有版本控制问题的危险。所以一个不使用bundle的解决方案是好的。

我猜答案可能是使用"守护进程"宝石,我已经尝试过了,但没有成功。

如果有人能看看github回购,并为我指明正确的方向,我将不胜感激。我发誓我已经尽了最大努力,花了很多小时在谷歌上搜索和实验!

更新

自从发布这篇文章以来,Transifex的作者们已经开始开发这个txgh网关,合并了我需要的更改,并对其进行了调整,使其能够在Heraku上运行。任何需要github和Transifex之间网关的人都应该点击此处:

一个将Transifex与GitHub 集成的服务器

编辑

虽然我怀疑这是一个很好的答案,但这是测试正在发生的事情的好方法。。。

我相信,一旦你的容器的主进程(Amazon实例)完成,就会有一个关闭和清理过程来杀死服务,让它进入"睡眠"状态,直到再次需要它。

我认为这实际上是一个与系统"弹性"方面有关的"功能",就像Heroku在"自动缩放"时动态关闭Dynos一样。

为了测试这一理论,一旦服务被设置为在后台运行,就在前台启动一个不同的应用程序(这样主进程仍然处于活动状态并挂起)。

即:

# do whatever you need to setup the service, i.e.:
bundle exec rackup &
# hang the main process for infinity:
ruby -e "sleep"

如果你的服务没有像以前那样关闭,我认为可以肯定地说,亚马逊关闭你是件好事。

当主进程"繁忙"时,我预计您的服务关闭需要更长的时间。尽管如此,我认为所有服务在没有收到请求时都会关闭,所以我怀疑任何"弹性"容器都会永远存在。

原始答案,当我还不明白这个问题时

我可能没有完全理解你的问题。。。但是

您可能可以在命令末尾使用&符号来在后台运行进程(这是一个unix/linux操作系统)。

尝试:

bundle exec rackup &

另一个问题是。。。为什么?为什么不让服务器作为主Docker容器服务运行呢?为什么要妖魔化应用程序?

最新更新