2015-04-08 77 views
3

我有一個基於事件機器的應用程序,我想作爲守護程序運行,因此我可以輕鬆地開始停止它。守護事件機器應用程序

我試圖使用守護進程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

可能不理想在調用守護進程或更高版本後執行停止嗎? – itdoesntwork

+0

之後。它從終端分離,創建pid文件,然後沒有其他事情發生。在日誌中沒有任何東西出現(如果我禁用守護進程,日誌接收輸入) – DVG

+0

我從gem提供的示例代碼中取得了[this](https://gist.github.com/sid-code/8ddb4573ea683bf6bec9 )。它工作正常。這是否將問題隔離到記錄器? – itdoesntwork

回答

0

如果您正在運行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 

配置新貴運行控制腳本

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發行者。雖然

相關問題