私は、ノードサーバーを稼働させ続けるために、ノードの永久モジュールを使用しています。ただし、システムを再起動すると永久に終了します。システムの再起動時に自動的にノードサーバーを(永遠に)起動する方法はありますか?
私はcrontabを使うことをお勧めします。使い方は簡単です。
編集を開始するには、以下のコマンドを実行して、 "testuser"をノードプロセスに必要なランタイムユーザーに置き換えます。自分以外のユーザーを選択した場合は、Sudoを使用してこれを実行する必要があります。
$ crontab -u testuser -e
これまで一度も行ったことがない場合は、どのエディタで編集したいかを尋ねられます。私はvimが好きですが、使いやすさのためにnanoをお勧めします。
エディタに入ったら、次の行を追加します。
@reboot /usr/local/bin/forever start /your/path/to/your/app.js
ファイルを保存してください。 cronがインストールされたというフィードバックを受け取るはずです。
Cronのインストールをさらに確認するには、次のコマンドを実行して( "testuser"をターゲットのユーザー名に置き換えます)、現在インストールされているcronsを一覧表示します。
$ crontab -u testuser -l
私の考えでは、cronでバイナリを実行するときは常にフルパスを使うべきです。また、永遠のスクリプトへのパスが正しくない場合は、which forever
を実行してフルパスを取得してください。
forever
がnode
を呼び出すことを考えると、node
へのフルパスを指定することもできます。
@reboot /usr/local/bin/forever start -c /usr/local/bin/node /your/path/to/your/app.js
これを行うために永遠のサービスを使用することができます。
npm install -g forever-service
forever-service install test
これにより、現在のディレクトリにapp.jsが永遠に経由するサービスとしてプロビジョニングされます。サービスはシステムが再起動されるたびに自動的に再起動します。また、停止したときには適切な停止を試みます。このスクリプトはlogrotateスクリプトもプロビジョニングします。
GithubのURL: https://github.com/zapty/forever-service
注:私は永遠の奉仕の作者です。
この事件はDebianに当てはまります。/etc/rc.local
に以下を追加
/usr/bin/Sudo -u {{user}} /usr/local/bin/forever start {{app path}}
{{user}}をあなたのユーザー名に置き換えてください
{{app path}}はあなたのアプリのパスに置き換えてください。例えば、/var/www/test/app.js
NPMを使用してPM2をグローバルにインストールする
npm install pm2 -g
あなたのスクリプトをpm2で始めてください
pm2 start app.js
アクティブな起動スクリプトを生成する
pm2 startup
メモ:pm2起動は、システムの再起動時にPM2を起動するためのものです。 PM2は一度起動すると、システムが停止する前に管理していたすべてのプロセスを再起動します。
自動起動を無効にしたい場合は、pm2 unstartupを使用してください。
起動スクリプトを別のユーザーの下で実行したい場合は、-u <username>
オプションと--hp <user_home>:
を使用してください。
this answerおよび this ブログ記事に触発された代替のcrontabメソッド。
1。 bashスクリプトファイルを作成します(bobを目的のユーザーに変更します)。
vi /home/bob/node_server_init.sh
2。これをコピーして先ほど作成したファイルの中に貼り付けます
#!/bin/sh
export NODE_ENV=production
export PATH=/usr/local/bin:$PATH
forever start /node/server/path/server.js > /dev/null
設定に従って上記のパスを編集してください。
3。 bashスクリプトを実行できることを確認してください。
chmod 700 /home/bob/node_server_init.sh
4。 "bob"をnodeのランタイムユーザーに置き換えます
crontab -u bob -e
5。コピーして貼り付けます(bobを目的のユーザーに変更します)
@reboot /bin/sh /home/bob/node_server_init.sh
Crontabを保存してください。
あなたはそれを最後までやり遂げました、あなたの賞品は(テストするために)再起動です:)
添付の 質問 から回答をコピーした。
PM2 を使用することができます。これは、ロードバランサを内蔵したNode.jsアプリケーションのプロダクションプロセスマネージャです。
PM2をインストール
$ npm install pm2 -g
アプリケーションを起動する
$ pm2 start app.js
あなたはエクスプレスを使用しているなら、あなたはあなたのようにあなたのアプリを起動することができます
pm2 start ./bin/www --name="app"
実行中のすべてのプロセスを一覧表示します。
$ pm2 list
すべてのプロセスが一覧表示されます。その後、次のコマンドでアプリのIDまたは名前を使用してサービスを停止/再開できます。
$ pm2 stop all
$ pm2 stop 0
$ pm2 restart all
ログを表示する
$ pm2 logs ['all'|app_name|app_id]
そのためには/etc/init.dフォルダにシェルスクリプトを作成する必要があります。一度もしたことがなければ、それはちょっと複雑ですが、ウェブ上のinit.dスクリプトにはたくさんの情報があります。
これは、CoffeeScriptサイトを永久に実行するために作成したスクリプトのサンプルです。
#!/bin/bash
#
# initd-example Node init.d
#
# chkconfig: 345
# description: Script to start a coffee script application through forever
# processname: forever/coffeescript/node
# pidfile: /var/run/forever-initd-hectorcorrea.pid
# logfile: /var/run/forever-initd-hectorcorrea.log
#
# Based on a script posted by https://Gist.github.com/jinze at https://Gist.github.com/3748766
#
# Source function library.
. /lib/lsb/init-functions
pidFile=/var/run/forever-initd-hectorcorrea.pid
logFile=/var/run/forever-initd-hectorcorrea.log
sourceDir=/home/hectorlinux/website
coffeeFile=app.coffee
scriptId=$sourceDir/$coffeeFile
start() {
echo "Starting $scriptId"
# This is found in the library referenced at the top of the script
start_daemon
# Start our CoffeeScript app through forever
# Notice that we change the PATH because on reboot
# the PATH does not include the path to node.
# Launching forever or coffee with a full path
# does not work unless we set the PATH.
cd $sourceDir
PATH=/usr/local/bin:$PATH
NODE_ENV=production PORT=80 forever start --pidFile $pidFile -l $logFile -a -d --sourceDir $sourceDir/ -c coffee $coffeeFile
RETVAL=$?
}
restart() {
echo -n "Restarting $scriptId"
/usr/local/bin/forever restart $scriptId
RETVAL=$?
}
stop() {
echo -n "Shutting down $scriptId"
/usr/local/bin/forever stop $scriptId
RETVAL=$?
}
status() {
echo -n "Status $scriptId"
/usr/local/bin/forever list
RETVAL=$?
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart)
restart
;;
*)
echo "Usage: {start|stop|status|restart}"
exit 1
;;
esac
exit $RETVAL
Init.dスクリプトはrootとして実行されるので、フォルダーとPATHが明示的に設定されているか、またはrootユーザーが使用できるようにしなければなりません。
PM2 を使う
これは、サーバー運用サーバーを実行するための最良の選択肢です。
このようにアプリケーションを実行することの利点は何ですか?
アプリケーションがクラッシュした場合、PM2は自動的にアプリケーションを再起動します。
PM2は未処理の例外のログを保存します - この場合は/home/safeuser/.pm2/logs/app-err.logのファイルにあります。
1つのコマンドで、PM2は、サーバーが再起動したときに管理しているすべてのアプリケーションを確実に再起動できます。基本的に、あなたのノードアプリケーションはサービスとして起動します。
ノードアプリケーションをサービスとして実行することは永遠にできませんでした。正しい方法は、/ etc/inittabエントリ(古いLinuxシステム)または起動(新しいLinuxシステム)を作成することです。
これをupstartとして設定する方法に関するいくつかのドキュメントがあります。 https://github.com/cvee/node-upstart
centOS x86 6.5ではcrontabが使えません。 @rebootが機能していないようです。
最後に私はこの解決策を得ました。
/etc/rc.localを編集します
Sudo vi /etc/rc.local
この行をファイルの末尾に追加してください。 USER_NAMEとPATH_TO_PROJECTを自分のものに変更します。 NODE_ENV = productionは、アプリがプロダクションモードで実行されることを意味します。複数のnode.jsアプリを実行する必要がある場合は、さらに行を追加できます。
su - USER_NAME -c "NODE_ENV=production /usr/local/bin/forever start /PATH_TO_PROJECT/app.js"
NODE_ENVを別の行に設定しないでください。アプリは開発モードで実行されます。永遠にNODE_ENVを取得することはありません。
# WRONG!
su - USER_NAME -c "export NODE_ENV=production"
保存してviを終了します(Escキーを押します:w q return)。サーバーを再起動してみてください。サーバーを再起動すると、ssh経由でリモートからどのアカウントにもログインしなくても、node.jsアプリケーションは自動的に実行されます。
シェルにNODE_ENV環境を設定した方がいいでしょう。アカウントUSER_NAMEがログインすると、NODE_ENVが自動的に設定されます。
echo export NODE_ENV=production >> ~/.bash_profile
そのため、NODE_ENVを再度設定せずに、sshを介して永遠にstop/start /PATH_TO_PROJECT/app.jsのようなコマンドを実行できます。
私はまさにこれを行うスクリプトを書きました:
https://github.com/chovy/node-startup
私は永遠に試したことはありませんが、実行するコマンドをカスタマイズすることができます。
/etc/init.d/node-app start
/etc/init.d/node-app restart
/etc/init.d/node-app stop
私は上記の答えをたくさん試しました。それらのどれも私のために働きませんでした。私のアプリはrootではなく/home
に、そしてユーザーとしてインストールされます。これはおそらく、上記の起動スクリプトが実行されたときに/home
がまだマウントされていないため、アプリが起動されていないことを意味します。
それから私はデジタルオーシャンによってこれらの指示を見つけました:
説明されているようにPM2を使用するのは非常に簡単で、完璧に動作します。それ以来、私の仮想サーバーは物理的に2回クラッシュしました。
Rc.localの問題は、コマンドがrootとしてアクセスされることです。これは、ユーザーとしてログインしてSudoを使用することとは異なります。
私はetc/profile.dにしたい起動コマンドで.shスクリプトを追加することでこの問題を解決しました。 profile.d内の.shファイルは自動的にロードされ、コマンドは通常のSudoを使用したかのように扱われます。
これに対する唯一の欠点は、指定されたユーザーが開始するためにログインする必要があることです。これは私の状況ではいつもそうでした。
シェルで次のコマンドを使用して、ノードを永遠に起動できます。
forever app.js //私のノードスクリプト
アプリを実行しているサーバーは常にオンにしておく必要があることに留意する必要があります。
完全な例のcrontab(/ etc/crontabにあります)。
#!/bin/bash
# edit this file with .. crontab -u root -e
# view this file with .. crontab -u root -l
# put your path here if it differs
PATH=/root/bin:/root/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
# * * * * * echo "executes once every minute" > /root/deleteme
@reboot cd /root/bible-api-dbt-server; npm run forever;
@reboot cd /root/database-api-server; npm run forever;
@reboot cd /root/mailer-api-server; npm run forever;