【问题标题】:Daemonizing an eventmachine app守护一个 eventmachine 应用程序
【发布时间】:2015-06-13 09:16:00
【问题描述】:

我有一个基于事件机的应用程序,我想将其作为守护程序运行,因此我可以轻松启动停止它。

我正在尝试使用守护进程 gem,但它似乎只是跳过了 EM 运行循环并在脚本末尾死亡。

一个例子:

require 'daemons'
require 'eventmachine'
require 'logging'

logger = Logging.logger['DAEMON']
logger.level = :debug

logger.add_appenders \
  Logging.appenders.file('logs/daemon.log')

Daemons.daemonize
File.open('/tmp/mydaemon.pid', 'w') { |f| f.puts(Process.pid) }

EM.run {
  EM.add_periodic_timer(1) { logger.info "I'm logging in a daemon" }
}

我也尝试过在 Daemon.run 或 Process.daemon 中执行此操作,但没有更好的运气。有什么想法吗?

【问题讨论】:

  • 在调用 daemonize 之后或之后会停止执行吗?
  • 之后。它从终端分离,创建 pid 文件,然后什么都没有发生。日志中从未出现任何内容(如果我禁用守护进程,则日志会接收输入)
  • 我从 gem 中提供的示例中提取了代码并制作了 this。它工作正常。这是否会将问题隔离到记录器?

标签: ruby daemon eventmachine


【解决方案1】:

如果您运行的是 Ubuntu(或其他基于 Upstart 的 Linux),我使用以下脚本和服务配置来运行 EventMachine 服务。也许它会为你工作。对于其他基于 init 的系统,您可能可以修改该方法。

在这个例子中,SVC 是我的应用程序的名称,BASEHOME 是我安装它的位置(在我的例子中是/usr/share

为您的 EM 服务器创建一个初始化控制脚本

将此文件放在您的 EM 应用的 lib 目录中,并适当地更新 SVCBASEDIR

#!/bin/bash
SVC=em-server
BASEHOME=/usr/share    
BASEDIR=$BASEHOME/$SVC    
echo Starting $SVC: `date`
echo Running as: `whoami`   
echo Running in: $BASEDIR
### Set RVM source if you are using it, otherwise remove these two lines
source "/usr/local/rvm/scripts/rvm"
rvm use 2.1
###
cd $BASEDIR    
ruby $BASEDIR/lib/em_server.rb

配置 Upstart 以运行控制脚本

sudo -i

SVC=em-server
BASEDIR=/usr/share/$SVC

adduser $SVC --system
usermod -a  -G em-service $SVC
chown --recursive $SVC:$SVCGRP $BASEDIR
chmod --recursive 660 $BASEDIR
chmod 550 $BASEDIR/lib/start_em_service_upstart.sh
chmod 550 $BASEDIR/scripts/*
cat > /etc/init/$SVC.conf <<EOF
    description     "EM Server"
    start on (starting network-interface
     or starting network-manager
     or starting networking)
    stop on runlevel [!2345]
    setuid $SVC
    exec $BASEDIR/lib/start_em_service_upstart.sh
    respawn
EOF

initctl reload-configuration

exit

运行sudo service em-server start 试试看。

请务必查看/var/log/upstart/em_server.log 以获取有关服务是否按预期启动或出现其他问题的反馈。

另外,请注意 RVM 可能会导致各种问题。在我的示例中,我将其设置为多用户以避免烦人的 Ruby 和 Bundler 发行者。不过可能不太理想

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 2015-06-08
    相关资源
    最近更新 更多