node.jsアプリケーションを永続的に実行するにはどうすればよいですか?


259

DebianサーバーにNode.jsをインストールしました。私はこのコマンドラインでパテからアプリを起動する方法を理解しています:

node /srv/www/MyUserAccount/server/server.js

アドレス50.51.52.53:8080(IPおよびポート)でアクセスします。

しかし、パテを閉じるとすぐに、アドレスに到達できなくなり50.51.52.53:8080ます。

Node.jsアプリケーションを永続的に実行する方法は?

ご想像のとおり、私はLinuxとNode.jsの初心者です。


7
何らかの理由でForeverを使用したくない場合は、pm2Foreverの優れた代替手段であることに注意してください。
Kevin B

ありがとう@KevinB github.com/Unitech/pm2は本当に良い代替手段です
Sachin Chavan

回答:


221

他の答えはOPの問題を解決しますが、それらはすべてやり過ぎであり、彼または彼女がこの問題を経験している理由を説明しません。

重要なのは、この行です。「パテを閉じると、アドレスに到達できません」

Puttyでリモートホストにログインすると、SSH linuxプロセスが開始され、そのSSHセッションから入力されたすべてのコマンドは、そのプロセスの子として実行されます。

問題は、Puttyを閉じるとSSHセッションを終了し、そのプロセスとアクティブな子プロセスを強制終了することです。パテを閉じると、フォアグラウンドで実行したため、サーバーを誤って強制終了します。この動作を回避するには、コマンドに&を追加して、サーバーをバックグラウンドで実行します。

node /srv/www/MyUserAccount/server/server.js &

ここでの問題は、Linuxに関する知識の欠如であり、ノードに関する問題ではありません。詳細については、http//linuxconfig.org/understanding-foreground-and-background-linux-processesをご覧ください。

更新:

他の人が述べたように、ノードサーバーは、ターミナルを終了するときに依然として停止する可能性があります。私が遭遇した共通の落とし穴は、ノードプロセスがbgで実行されている場合でも、それがstdoutであり、stderrが依然としてターミナルでポイントされていることです。つまり、ノードサーバーがconsole.logまたはconsole.errorに書き込むと、壊れたパイプエラーとクラッシュが発生します。これは、プロセスの出力をパイプすることで回避できます。

node /srv/www/MyUserAccount/server/server.js > stdout.txt 2> stderr.txt &

問題が解決しない場合は、tmuxnohupなどを調べてください。、すべてのタイプのプロセス(データベース、ロギングサービス、その他の言語)の実行に使用できるため、ノード固有のソリューションよりもさらに堅牢な。

サーバーが終了する可能性のある一般的な間違いは、実行後、nohup node your_path/server.js &クリックするだけでPuttyターミナルを閉じることです。exit代わりにコマンドを使用する必要があります。そうすると、ノードサーバーが起動して実行されます。


7
&ただし、サービスの実行中にパテセッションを閉じると、サービスは終了します。(Debian Jesseでテスト済み)
NiCk Newman 2015

1
@NiCkNewmanが言ったように、この答えは不完全です!正しい解決策については、リックロイの回答を参照してください。
thejonwithnoh 2015年

19
「&」はプロセスをバックグラウンドで実行しますが、実際にこのコマンドの先頭に「nohup」を追加してコンソールウィンドウから切り離す必要があるため、数回ウィンドウがスリープ状態になってもアプリケーションは停止しません。時間に前述のコマンドを修正:nohup node /srv/www/MyUserAccount/server/server.js &
SirRodge

2
AIX powersystem nohup node myApp.js &は、bgでアプリを実行しましたが、期間が終了したときにアプリが終了しました。なぜだかわかりません。
AnBisw 2017

4
@Annjawn、exitターミナルを終了するにはコマンドを使用する必要があります。
Ionut Necula 2018年

342

次のようにnpmを使用して永久にインストールできます

sudo npm install -g forever

次に、次のコマンドでアプリケーションを開始します。

forever server.js

またはサービスとして:

forever start server.js

アプリがクラッシュしたり、なんらかの理由で停止したりすると、アプリがいつまでも再起動します。再起動を5に制限するには、次のように使用できます。

forever -m5 server.js

実行中のすべてのプロセスを一覧表示するには:

forever list

大括弧内の整数に注意して、プロセスを停止するには次のように使用します。

forever stop 0

実行中のプロセスを再起動すると、次のようになります。

forever restart 0

アプリケーションファイルで作業している場合は、-wパラメーターを使用して、server.jsファイルが変更されるたびに自動的に再起動できます。

forever -w server.js

11
@MarthaJames sshセッション/ウィンドウが閉じるときに閉じる場合、おそらく「start」をforever start <file>
Kristian

8
使用しての違いは何だforever server.jsとはforever start server.js?「サービスとして」と書いてありますが、どういう意味ですか?
Marquizzo 2016

5
と入力するforever server.jsと、サーバーが起動します。Ctrl+ を押すとC、サービスが停止します。入力forever start server.jsするとサービスが開始され、Ctrl+ を押してもC開いたままになります。次に、上記の他の参照されているコマンドを実行して、リストを停止/確認できます。それは私が少なくとも経験したものです。
Termato

6
サーバーの再起動後にスクリプトが開始されますか?
arealex 2016年

1
foreverモジュール(v0.15.3)は、サービス攻撃の正規表現拒否に対して脆弱であるため、使用しないでください。github.com/foreverjs/forever/issues/960
ベニー・ノイゲバウアー

82

PM2を使用できます。これは、ロードバランサーが組み込まれたNode.jsアプリケーションのプロダクションプロセスマネージャーです。

PM2をインストールする

$ npm install pm2 -g

アプリケーションを開始する

$ pm2 start app.js

Expressを使用している場合は、次のようにアプリを起動できます

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]

1
神のお恵みがありますように!できます!!ForeverとNohupは、Amazon Webサービスのbitnami nodejsサーバー(docs.bitnami.com/aws/infrastructure/nodejsでは機能しません。PM2は素晴らしいです!
polras

このライブラリはgithubでの起動数が最も多いようです
DragonFire

41

クラッシュが発生した場合にノードを再起動して、デーモン化を処理するForeverなどを探すことをお勧めします。


nohupこのように実行すると、sshセッションを終了するときにnodeが終了することを指摘したいと思います(screen to tmuxのようなものを使用している場合を除く)。
Haozhun 2013年

1
@Haozhun、興味深いですが、私のマシンでそれが私のために働いている方法ではありません。sshでこのコマンドを使用して何かを開始すると、SSHセッションを閉じた後でも、バックグラウンドで永久に実行されます。
ブラッド

@Brad上の第二の答えを参照してくださいstackoverflow.com/questions/4018154/...を。説明する質問の最初のコメントに同意する人がかなりいるようnohupです。この混乱を解決できれば素晴らしいと思います。しかし、どこから始めればよいかわかりません。
Haozhun 2013年

4
ほとんどのunixen(Linuxのほとんどのディストリビューションを含む)では、ターミナルウィンドウを閉じた場合、バックグラウンドで実行するとプロセスが強制終了されます。これを防ぐには、で実行しnohupます。例:nohup node app.js &
slebetman 2013

1
私は製品Linux環境でForeverを使用しています。私は通常、コマンドforever start --minUptime 10000 -o /logs/myapp.log nodeApp.js
mbokil

36

ターミナルで常にノードアプリを実行したい場合は、screenを使用します。

ubuntu / debianにインストール:

sudo apt-get install screen

使用法:

$ screen
$ node /path/to/app.js

ctrl + a その後 ctrl + d却下する

戻るために:

1つの画面: screen -r

複数ある場合は、次のコマンドですべての画面を一覧表示できます。 screen -ls

その後: screen -r pid_number


1
それはいつでもフォアグラウンドにプロセスを切り替えることが私にできますので、これは良いオプションです
aexl

26

あなたは単にこれを使うことができます

nohup node /srv/www/MyUserAccount/server/server.js &

これにより、アプリケーションが実行され続け、アプリケーションをシャットダウンするには、アプリケーションを強制終了する必要があります。

そのためには、インストールしてhtopからノードを検索してそれを強制終了することができます


18
この場合、ユーザーはPuTTYセッションを適切に(つまり、exitコマンドを使用して)終了する必要があることに注意してください。ユーザーが単にウィンドウを閉じるSIGHUPと、プロセスを終了する以外の信号が使用される可能性があるため、ノードはとにかくシャットダウンします。
thejonwithnoh 2015年

1
問題に対する単純な多目的Linuxソリューションであることの+1。これは、DogNibblerの回答よりも優れています
thejonwithnoh 2015年

@thejonwithnohあなたのコメントを読んだ後、私は突然パテを閉じてみましたが、サーバーはまだ機能していました、おそらくそれはenvの構成方法に関係していました。しかし、私はOPがこれを達成するための最も簡単な方法であると尋ねていることを考えました
Rick Roy

私はこの単純なアプローチが好きです、それが私が使用しているものです、それを殺すことに関しては、最も簡単なのはkillall node、すべてのノードプロセスを殺すだけの場合です。
ネルソン

@Nelson複数のスクリプトを実行していて、特定のスクリプトを1つだけ終了したい場合は、すべてのノードプロセスを強制終了します。本番サーバーで複数のノードプロセスを実行している場合に備えて、プロセスを見つけてその特定のプロセスを終了することをお勧めします。そして悪夢に入るような気にしたくない:D
Rick Roy

12

永遠には、まさにそのための非常に優れたNodeJsモジュールです。

foreverコマンドラインに入力してインストールする

$ npm install forever -g

次に、次のコマンドを使用してnode.jsスクリプトを実行します

$ forever start /path/to/script.js

準備できた。さらに、実行することができます

$ forever list

実行中のすべてのスクリプトを確認します。次のように入力して、特定のスクリプトを終了できます

$ forever stop [pid]

どこ[pid]どこから入手するスクリプトのプロセスIDでlistコマンドが。すべてのスクリプトを停止するには、次のように入力します

$ forever stopall

10

nohupは私がAWS Ubunto vmでチェックインしましたsyntax

ubuntu@ip-172-00-00-00:~/ms$ nohup node server.js &

Enterキーを押すと、この行が表示されます

ubuntu@ip-172-00-00-00:~/ms$ nohup: ignoring input and appending output to nohup.out

次にこれを入力します

rm nohup.out

ここに画像の説明を入力してください


3
私😂プロンプト小さなbashでホスト名を打ち抜いたが、窓の大きなタイトルにそれを残したかのような
コニー

10

取り付け

$ [sudo] npm install forever -g

foreverを使用してスクリプトを継続的に実行できます

forever start server.js

forever list

サービスを停止するため

forever stop server.js

9

ここだ成り上がりの私は私の個人的なプロジェクトのために使用されてきた解決策は:

それを配置し/etc/init/node_app_daemon.confます:

description "Node.js Daemon"
author      "Adam Eberlin"

stop on shutdown

respawn
respawn limit 3 15

script
  export APP_HOME="/srv/www/MyUserAccount/server"
  cd $APP_HOME
  exec sudo -u user /usr/bin/node server.js
end script

これは、アプリケーションがクラッシュした場合のアプリケーションの再生成も処理します。アプリケーションが15秒未満で3回以上クラッシュした場合、アプリケーションを再起動する試みを中止します。


9

開発中は、nodemonを使用することをお勧めします。ファイルが変更されるたびにサーバーを再起動します。他の人が指摘したように、Foreverはオプションですが、本番環境ではすべて、使用しているプラ​​ットフォームによって異なります。通常は、オペレーティングシステムが推奨するサービスを維持する方法を使用します(例:http : //www.freedesktop.org/wiki/Software/systemd/)。


これはMEAN.JSアプリケーションで機能しました- nodemonサーバーのJSファイルを指定しない限りgruntコマンドを実行するため、これを使用してmongoとノードを永久に/同時に実行します
J-Dizzle

8

私はその仕事を完全にうまくやることを永遠に見つけました。

npmがすでにインストールされていると仮定し、インストールされていない場合は、

sudo apt-get install npm

その後、永久にインストールします

npm install forever --global

これでこのように実行できます

forever start app.js

https://codingweb.io/run-nodejs-application-background/


npm rm -g永久に削除
DragonFire


5

別の方法は、アプリのシステムユニットを作成することです。次のように、「/ etc / systemd / system」フォルダに「XXX.service」ファイルを作成します。

[Unit]
Description=swagger
After=network.target

[Service]
ExecStart=/usr/bin/http-server /home/swagger/swagger-editor &
WorkingDirectory=/home/swagger
Restart=always
RestartSec=30

[Install]
WantedBy=multi-user.target

利点は、アプリがサービスとして実行され、クラッシュした場合に自動的に再起動することです。

sytemctlを使用して管理することもできます:

systemctl start XXXサービスを開始し、systemctl stop XXX停止し、systemctl enable XXXシステムの起動時にアプリを自動的に開始します。


4

これがお役に立てば幸いです。

コマンドラインで、永久にインストールします。

npm install forever -g

サンプルファイルを作成します。

sudo nano server.js 

ファイルを編集して、ブラウザで直接結果を取得できます。
filezillaまたは任意のエディターを使用してファイルを編集できます。次のコマンドを実行してファイルを実行します。

forever start --minUptime 1 --spinSleepTime 1000 -w server.js

ここに画像の説明を入力してください


4

他のパッケージをインストールする必要はありません。

このコマンドを実行する

node server.js > stdout.txt 2> stderr.txt &

server.jsはサーバーファイルです。。api.jsかまいん。

その後、「exit」を押してターミナルを閉じます

exit

2

Node.jsアプリケーションのプロセスマネージャーであるPM2の使用をお勧めします。PM2は、アプリケーションを管理およびデーモン化(サービスとして実行)する簡単な方法を提供します。

このリンクを参照してください-https://www.digitalocean.com/community/tutorials/how-to-set-up-a-node-js-application-for-production-on-centos-7


1
PM2を推奨する回答はすでにあります。 stackoverflow.com/a/40254977/390718
ホピア2017

0

永遠にパッケージは私のために働いた、ただ一つのこと、それはdeep-equalに依存しているので、あなたがそれをインストールすることに問題があった場合:

npm -g install forever

試してください:

npm -g install forever deep-equal@1.1.1

代わりに。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.