【问题标题】:Upstart script for node.js appnode.js 应用程序的新贵脚本
【发布时间】:2012-12-08 13:38:39
【问题描述】:

我无法启动 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 时,我得到:

开始:未知工作:应用程序

我怎样才能做到这一点?

【问题讨论】:

  • 我将您的脚本复制到/etc/init/app.conf,它对我有用(启动了一个进程并创建了日志文件。)您确定该文件与 (ls -Al /etc/init/app.conf) 位于正确的位置吗?另外,什么版本的 Upstart (start --version) 和什么操作系统?
  • 是的,我确定它在那里.. Upstart 0.3.9 Ubuntu 8.04.4
  • 我一直使用 nodejitsu,它工作得很好我想要新贵,因为我想把它作为一种服务,它是一个简单的非常小的客户端支持聊天,所以.. 永远使用没什么大不了的。
  • 尝试 /etc/init.d 中的符号链接,例如 ln -s /lib/init/upstart-job app。
  • 您必须重新加载新贵的配置信息。为此使用“sudo initctl reload-configuration”。我在下面写了详细的答案

标签: node.js ubuntu upstart


【解决方案1】:

我在基于 Redhat 的最新 Amazon (AWS) linux 上运行时遇到了同样的问题。

我在/etc/init 中有我的upstart 文件,名为node.conf,当我运行sudo start node 时,我会收到与您类似的错误start: Unknown job: node

事实证明,如果您的 .conf 文件中有错误,该作业将无法启动。所以我从注释掉所有的行开始,慢慢建立起来找到错误。 错误信息不是很清楚,看起来像 upstart 找不到你的 conf 文件。

跟踪您的“/var/log/messages”将帮助您将 Upstart 日志调试到那里(在 Ubuntu 上可能有所不同。我说 init: /etc/init/node-upstart.conf:8: Unknown stanza 帮助我深入了解它。在我的特殊情况下我错误地声明了变量。

AskUbuntu 上查看类似主题。

这是我的编辑工作脚本:

<!-- 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

-- 编辑 2013-06-01 --

如果您像我一样使用 Centos 或 Amazon Linux,请查看此init.d script

-- 编辑 2013-10-14 --

这是我在 Amazon Linux(基于 Redhat)上实际使用的 init.d 脚本的link to a gist。我只是将它保存在我的项目中 init.d 文件夹下,然后符号链接到 /etc/init.d 文件夹中,现在它是一个守护进程/服务!

-- 编辑 2014-06-05 --

使用systemd 在生产环境中查看Jeff DickeyJeff Dickey 的这个很棒的systemd,这比我们在这里所做的所有事情都更清洁和更容易(恕我直言)。他还使用 Ansible 来控制他的集群(我喜欢这个),但如果你还没有准备好,你不必走那么远。

【讨论】:

  • 您的代码不允许在非特权用户下运行应用程序(您的代码不起作用)。请参阅下面的工作示例。在 Ubuntu 上使用 systemd 没有任何意义。 Upstart 允许做任何你需要的事情,包括延迟 node.js 的启动,直到 mongodb 或其他服务启动。
【解决方案2】:

经过几次尝试,我为 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 

【讨论】:

  • 感谢@Roman,我将它用于我的服务器。但是,当使用exec sudo -u 以其他用户身份运行时,将不会设置上面导出的环境变量。我通过运行 `exec sudo -u myuser sh- c "PORT=3000 SOME_VAR=SOME_VALUE $NODE_PATH server.js [...]" 解决了这个问题,但我想知道是否有办法让环境变量自动跟随myuser 的外壳?
  • @JHH 请尝试我的脚本的改进版本
猜你喜欢
  • 1970-01-01
  • 2016-05-29
  • 2015-01-04
  • 2015-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-18
相关资源
最近更新 更多