我如何 运行 Ruby 应用使用 Sinatra 作为服务
How do I run a Ruby app using Sinatra as a service
我知道这个问题已经被问过和回答过很多次了,而且我已经阅读了关于这个主题的每一个问答,但我仍然一头雾水。
我是一个 Ruby 菜鸟,正在尝试使用 Sinatra 和 Strava 构建一个 Ruby 应用程序(由其他人构建)作为 运行 在 Linux 中的一项服务.它是处理与 github 同步 Transifex 语言翻译的网关。我已经分叉了原始代码并修复了一些错误,以至于它现在运行良好。我的仓库在这里:
https://github.com/Fabrik/txgh
原始文档仅展示了如何使用 "bundle exec rackup" 从命令行 运行 它。我尝试通过简单地将 rc.local 中的 bundle 命令后台化来进行守护进程,但这不起作用。我不喜欢使用捆绑包,因为这是 运行ning 在专用的小型 Amazon ECS 实例上,我不会在其上安装任何其他 Ruby,因此没有版本控制问题的危险。所以不使用 bundle 的解决方案很好。
我猜答案可能是使用 'daemons' gem,我已经尝试过了,但毫无进展。
如果有人可以看一下那个 github 回购协议,并为我指出正确的方向,我将不胜感激。我发誓我已经尽力了,并且花了很多时间在谷歌上搜索和试验!
更新
自发布这篇文章以来,Transifex 作者开始开发这个 txgh 网关,合并了我需要的更改,并对其进行了调整,以便能够 运行 在 Heraku 上。任何需要在 github 和 Transifex 之间建立网关的人都应该去这里:
编辑
虽然我怀疑这是一个很好的答案,但它是测试正在发生的事情的好方法...
我相信一旦您的容器的主进程(Amazon 实例)完成,就会有一个关闭和清理进程终止服务,将其放入 "sleep"直到再次需要它。
我假设这实际上是一个 "feature" 与系统的 "elastic" 方面相关,很像 Heroku 在 "auto-scaling" 时动态关闭 Dynos。
为了测试这个理论,一旦服务在后台设置为 运行,在前台启动一个不同的应用程序(这样主进程仍然处于活动状态并挂起)。
即:
# do whatever you need to setup the service, i.e.:
bundle exec rackup &
# hang the main process for infinity:
ruby -e "sleep"
如果您的服务没有像以前那样关闭,我认为可以肯定地说,最好的办法是亚马逊关闭您。
当主进程处于 "busy" 时,我希望您的服务关闭需要更长的时间。不过,我假设所有服务在未收到请求时都会关闭,所以我怀疑任何 "elastic" 容器会永远存在。
原答案,当时我还没看懂问题
我可能没有正确理解您的问题...但是...
您可以在命令末尾使用 &
符号来 运行 后台进程(这是 unix/linux OS 的事情)。
尝试:
bundle exec rackup &
另一个问题是……为什么?为什么不让服务器 运行 作为主要的 Docker 容器服务?为什么要妖魔化应用程序?
我知道这个问题已经被问过和回答过很多次了,而且我已经阅读了关于这个主题的每一个问答,但我仍然一头雾水。
我是一个 Ruby 菜鸟,正在尝试使用 Sinatra 和 Strava 构建一个 Ruby 应用程序(由其他人构建)作为 运行 在 Linux 中的一项服务.它是处理与 github 同步 Transifex 语言翻译的网关。我已经分叉了原始代码并修复了一些错误,以至于它现在运行良好。我的仓库在这里:
https://github.com/Fabrik/txgh
原始文档仅展示了如何使用 "bundle exec rackup" 从命令行 运行 它。我尝试通过简单地将 rc.local 中的 bundle 命令后台化来进行守护进程,但这不起作用。我不喜欢使用捆绑包,因为这是 运行ning 在专用的小型 Amazon ECS 实例上,我不会在其上安装任何其他 Ruby,因此没有版本控制问题的危险。所以不使用 bundle 的解决方案很好。
我猜答案可能是使用 'daemons' gem,我已经尝试过了,但毫无进展。
如果有人可以看一下那个 github 回购协议,并为我指出正确的方向,我将不胜感激。我发誓我已经尽力了,并且花了很多时间在谷歌上搜索和试验!
更新
自发布这篇文章以来,Transifex 作者开始开发这个 txgh 网关,合并了我需要的更改,并对其进行了调整,以便能够 运行 在 Heraku 上。任何需要在 github 和 Transifex 之间建立网关的人都应该去这里:
编辑
虽然我怀疑这是一个很好的答案,但它是测试正在发生的事情的好方法...
我相信一旦您的容器的主进程(Amazon 实例)完成,就会有一个关闭和清理进程终止服务,将其放入 "sleep"直到再次需要它。
我假设这实际上是一个 "feature" 与系统的 "elastic" 方面相关,很像 Heroku 在 "auto-scaling" 时动态关闭 Dynos。
为了测试这个理论,一旦服务在后台设置为 运行,在前台启动一个不同的应用程序(这样主进程仍然处于活动状态并挂起)。
即:
# do whatever you need to setup the service, i.e.:
bundle exec rackup &
# hang the main process for infinity:
ruby -e "sleep"
如果您的服务没有像以前那样关闭,我认为可以肯定地说,最好的办法是亚马逊关闭您。
当主进程处于 "busy" 时,我希望您的服务关闭需要更长的时间。不过,我假设所有服务在未收到请求时都会关闭,所以我怀疑任何 "elastic" 容器会永远存在。
原答案,当时我还没看懂问题
我可能没有正确理解您的问题...但是...
您可以在命令末尾使用 &
符号来 运行 后台进程(这是 unix/linux OS 的事情)。
尝试:
bundle exec rackup &
另一个问题是……为什么?为什么不让服务器 运行 作为主要的 Docker 容器服务?为什么要妖魔化应用程序?