守护一个eventmachine应用程序

时间:2015-04-08 12:10:15

标签: ruby daemon eventmachine

我有一个基于事件机器的应用程序,我想作为守护程序运行,所以我可以轻松地开始停止它。

我试图使用守护进程gem,但它似乎只是跳过EM runloop并在脚本结束时死掉。

一个例子:

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中做过,没有更好的运气。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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

在此示例中, SVC 是我的应用程序的名称,而 BASEHOME 是我将其安装到的位置(在我的情况下为/usr/share

为您的EM服务器创建一个init控制脚本

将此文件放在EM应用程序的lib目录中,并相应地更新 SVC BASEDIR

#!/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发行者。可能不太理想,但