【问题标题】:Deploy a TCP Server written in Ruby部署一个用 Ruby 编写的 TCP 服务器
【发布时间】:2017-08-08 06:25:00
【问题描述】:

我用 ruby​​ 编写了一个 TCP 服务器,运行在端口 2000 上,带有事件机器。

现在,我做的是 ssh 到我的服务器并运行命令 ruby lib/tcp_server.rb 以打开服务器,但当我注销时它会关闭。

我已经尝试过 nohup 并使用 &,但似乎没有什么能长时间使用服务器。

所以我的问题是,我如何在端口 2000 上部署此服务器并使其保持运行,就像我们如何将 Rails 部署到 nginx 一样。

它不是网络服务器,而是连接设备的 tcp 服务器,如果有帮助的话。

谢谢!

【问题讨论】:

  • 你需要守护你的ruby脚本。
  • @pascalbetz 是的,我从阅读中了解到,并认为将 & 放在命令末尾应该可以做到,但事实并非如此。您如何建议将其守护进程?
  • 您可以使用像 daemons 这样的 gem 来使脚本自己守护进程,也可以使用像 daemontools 这样的外部实用程序来守护(和管理)任意脚本。
  • @Shobhit 请尝试 Stefan 提出的解决方案之一。如果您有任何问题,那么您可以提出更具体的问题。
  • 目前使用Process.daemon 可以工作,但如果机器重新启动或进程被终止,则不会启动服务器。

标签: ruby sockets nginx deployment tcp


【解决方案1】:

解决方案 1:tmuxscreen

这是最简单的方法,您必须创建一个 tmux 或 screen 会话,然后在该会话中启动您的服务器。

解决方案 2:nohup

nohup ruby lib/tcp_server.rb > stdout.log 2> stderr.log &

您已经尝试过nohup 和使用&,我想您已经知道该怎么做了。

解决方案 3:守护进程

您可以从 shell 中分离并通过分叉来守护进程 它两次,设置会话 ID 并更改当前工作目录。

def daemonize
  exit if fork
  Process.setsid
  exit if fork
  Dir.chdir '/'
end

使用这种方法,您必须重定向 stdout 和 stderr 以保留日志。

另一种守护进程的方法是使用像 daemons 这样的 gem。

更新:

要在被杀死后自动重启进程,你需要一个像godpm2这样的进程管理器。

要在启动后自动启动进程,您需要编写一个init scripts,但它的外观取决于您的服务管理系统和操作系统。其中最著名的是 System V。如果您使用的是 Ubuntu,您可能需要查看 Upstartsystemd

【讨论】:

  • 是的,我已经完成了这些,问题是如果服务器重新启动,我需要重新启动它们,并且如果被杀死,进程不会自行重新启动。
猜你喜欢
  • 1970-01-01
  • 2013-09-07
  • 2013-12-07
  • 2016-08-30
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 2020-09-02
相关资源
最近更新 更多