11

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と、次のようになります。

開始:不明なジョブ:アプリ

どうすればこれを機能させることができますか?

4

2 に答える 2

16

Redhatベースの最新のAmazon(AWS)Linuxで同じ問題が発生していました。

upstartファイルが/etc/init呼び出されましたが、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またはAmazonLinuxを使用している場合は、このinit.dスクリプトをご覧ください。

-編集2013-10-14-

これは、Amazon Linux(Redhat Based)の本番環境で実際に使用しているinit.dスクリプトの要点へのリンクです。プロジェクトのinit.dフォルダの下に保存してから、フォルダ内のシンボリックリンクを作成するだけで/etc/init.d、デーモン/サービスになります。

-編集2014-06-05-

systemdを使用した本番環境でのNode.jsのJeffDickeyによるこの素晴らしいブログアーティクルをチェックしてください。これは、ここで行っているすべての作業(IMHO)よりもはるかにクリーンで簡単です。彼はまた、Ansibleを使用してクラスター(私は大好きです)を制御しますが、準備ができていない場合は、それほど遠くまで行く必要はありません。

于 2013-03-25T13:02:03.580 に答える
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   

すべてが正常に機能することを確認した後、リスポーンのコメントを解除することをお勧めします。

アップデート

スクリプトを改善しました(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 
于 2014-07-02T11:45:50.480 に答える