node.js app的Upstart脚本

时间:2012-12-20 23:41:37

标签: node.js ubuntu upstart

我无法启动Upstart脚本。

这是脚本(/ etc / init /中的app.conf)

description "node.js server"
author      "kvz"

start on startup
stop on shutdown

script
   # We found $HOME is needed. Without it, we ran into problems
   export HOME="/root"

   exec sudo -u /usr/local/bin/node \
                /var/www/vhosts/travelseguro.com/node/app.js \
                2>&1 >> /var/log/node.log
end script

当我运行sudo start app时,我得到:

  

开始:未知作业:app

我该如何做到这一点?

2 个答案:

答案 0 :(得分:16)

我在基于Redhat的最新亚马逊(AWS)linux上遇到了同样的问题。

我的/etc/init文件位于node.conf,名为sudo start node,当我运行start: Unknown job: node时,我会收到类似的错误.conf

事实证明,如果init: /etc/init/node-upstart.conf:8: Unknown stanza文件中存在错误,作业将无法启动。所以我开始评论所有的线条,慢慢地建立起来找到错误。 错误消息不是很清晰,并且看起来像upstart无法找到您的配置文件。

告诉你的'/ var / log / messages'将帮助你调试Upstart日志到那里(它可能在Ubuntu上有所不同。我说<!-- language: lang-sh --> #!upstart # using upstart http://upstart.ubuntu.com/getting-started.html and node forever https://github.com/nodejitsu/forever/ # to run server # redhat has additional sudo restrictions, you must comment out 'Default requiretty' from /etc/sudoers #startup monitoring script derived from http://stackoverflow.com/questions/11084279/node-js-setup-for-easy-deployment-and-updating description "node.js server" author "jujhar" env PROGRAM_NAME="node" env FULL_PATH="/home/httpd/buto-middleman/public" env FILE_NAME="forever.js" env NODE_PATH="/usr/local/bin/node" env USERNAME="springloops" start on startup stop on shutdown script export HOME="/root" export NODE_ENV=staging #development/staging/production echo $$ > /var/run/$PROGRAM_NAME.pid cd $FULL_PATH #exec sudo -u $USERNAME $NODE_PATH $FULL_PATH/$FILE_NAME >> /var/log/$PROGRAM_NAME.sys.log 2>&1 exec $NODE_PATH $FULL_PATH/$FILE_NAME >> /var/log/$PROGRAM_NAME.sys.log 2>&1 end script pre-start script # Date format same as (new Date()).toISOString() for consistency echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> /var/log/$PROGRAM_NAME.sys.log end script pre-stop script rm /var/run/$PROGRAM_NAME.pid echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> /var/log/$PROGRAM_NAME.sys.log end script 帮助我找到它的底部。在我的特殊情况我错误地声明了变量。

upstart上查看类似的帖子。

这是我的编辑的工作脚本:

init.d

- 修改2013-06-01 -

如果您使用像我这样的Centos或Amazon Linux,请查看此AskUbuntu

- 修改2013-10-14 -

这是我在Amazon Linux(Redhat Based)上实际使用的init.d脚本的init.d script。我只是将它保存在/etc/init.d文件夹下的项目中,然后在{{1}}文件夹中对其进行符号链接,现在它是一个守护进程/服务!

- 修改2014-06-05 -

使用link to a gist在生产中的Node.js上通过blog artcile查看这个真棒Jeff Dickey,这比我们在这里所做的所有事情(IMHO)更清晰,更容易。他还使用Ansible来控制他的星团(我喜欢它),但如果你还没有准备好,你就不必走那么远。

答案 1 :(得分:7)

经过几次尝试后,我为upstart实现了工作.conf文件,该文件作为服务在重启后自动启动并在崩溃时重新启动(重新生成)。它还可以使用非特权用户权限启动我的应用程序。该文件的名称是/etc/init/my-app.conf。

要开始/停止服务,请使用

sudo start my-app / sudo stop my-app

如果您遇到错误

start: Unknown job: my-app

执行以下命令

sudo initctl reload-configuration

我的/etc/init/my-app.conf文件:

#my-app                                                                           
description "node.js my-app website"                                                  
env FULL_PATH="/home/myuser/app.prod/app"                                              
env NODE_PATH="/usr/bin/node"                                                     


start on filesystem or runlevel [2345]                                            
stop on [!2345]                                                                   

script                                                                            
    export HOME="/root"                                                           
    export NODE_ENV=production                                                    
    echo $$ > /var/run/my-app.pid                                                 
    cd $FULL_PATH        
    #Use exec below if you want to launch it under myuser, 
    #don't forget to create /var/log/my-app.sys.log with appropriate permissions
    #exec sudo -u myuser sh -c "$NODE_PATH server.js >> /var/log/my-app.sys.log 2>&1" 
    exec $NODE_PATH server.js >> /var/log/my-app.sys.log 2>&1                     
end script                                                                        

pre-start script                                                                  
    echo "[`date`] (sys) Starting" >> /var/log/my-app.sys.log                     
end script                                                                        

pre-stop script                                                                   
    rm /var/run/my-app.pid                                                        
    echo "[`date`] (sys) Stopping" >> /var/log/my-app.sys.log                     
end script                                                                        

#uncomment respawn if you want to restart your service in case of crash
#respawn                                                                          
#respawn limit 50 30   

我建议您在确保一切正常后取消注释respawn。

<强>更新

我改进了我的脚本(请记住,它不是在root下工作,而是在常规用户 zn 下):

#znapi.conf                                                                    
description "node.js zn api"                                        

env FULL_PATH="/home/zn/app.prod"                          
env NODE_PATH="/usr/bin/node"                                  
env LOG="/var/log/znapi.log"
env PIDFILE="/var/run/znapi.pid"

# Start up when the system hits any normal runlevel, and 
#start on filesystem or runlevel [2345]     
#start when mongod started
start on started mongod

# shuts down when the system goes to shutdown or reboot.
stop on runlevel [06]                                                              

respawn
respawn limit 50 5

pre-start script                                                    
    # check that log file exist or create it
    test -f $LOG || { touch $LOG; chown zn:zn $LOG; }

    # Date format same as (new Date()).toISOString() for consistency
    echo "[`date`] (sys) Starting" >> $LOG            
end script                                                          

script                                                                       
    export NODE_ENV=production
    exec start-stop-daemon --start -m -p $PIDFILE -c zn -d $FULL_PATH -x server.js >> $LOG 2>&1
end script                                                                   

pre-stop script                                                              
    rm $PIDFILE                                                   
    echo "[`date`] (sys) Stopping" >> $LOG                    
end script