我有一个基于事件机器的应用程序,我想作为守护程序运行,所以我可以轻松地开始停止它。
我试图使用守护进程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中做过,没有更好的运气。有什么想法吗?
答案 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发行者。可能不太理想,但