web-dev-qa-db-ja.com

バックグラウンドサービスとしてnode.jsアプリを実行する方法

この記事は長年にわたって多くの注目を集めてきたので、私はこの記事の最後にプラットフォームごとのトップソリューションをリストしました。


元の投稿

Node.jsサーバーをバックグラウンドで実行したいのです。つまり、端末を閉じたときに、サーバーを実行し続けたいのです。私はこれをグーグルしてこの チュートリアル を思い付きました、しかしそれは意図したようには動作しません。それで、そのデーモンスクリプトを使う代わりに、私はちょうど出力リダイレクション(2>&1 >> file部分)を使ったと思いました、しかしこれもまた終わりません - 私はそれが出力/エラーを待っているように私の端末に空白行を得ます。

プロセスをバックグラウンドで実行しようとしましたが、端末を閉じるとすぐにプロセスも終了します。

それでは、ローカルコンピュータをシャットダウンしたときにどのように実行したままにすることができますか?


トップソリューション

421
Peter Kruithof

から自分の答えをコピーする 自分のプロセスとしてNode.jsアプリケーションを実行する方法を教えてください

2015回答:ほぼすべてのLinuxディストリビューションにsystemdが付属しています。これはforever、monitなどが不要になることを意味します - あなたのOSはすでにこれらのタスクを処理しています

myapp.serviceファイルを作成します(明らかに、「myapp」をアプリケーションの名前に置き換えます)。

[Unit]
Description=My app

[Service]
ExecStart=/var/www/myapp/app.js
Restart=always
User=nobody
# Note Debian/Ubuntu uses 'nogroup', RHEL/Fedora uses 'nobody'
Group=nogroup
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/var/www/myapp

[Install]
WantedBy=multi-user.target

Unixに慣れていない場合は注意してください。/var/www/myapp/app.jsの最初の行に#!/usr/bin/env nodeがあるはずです。

サービスファイルを/etc/systemd/systemにコピーします。

systemctl start myappで始めてください。

systemctl enable myappで起動時に実行できるようにします。

journalctl -u myappでログを見る

これはどのようにしてLinuxへのノードアプリのデプロイ、2018年版から取得されます。これには、Linux /ノードサーバーを構築するためのAWS/DigitalOcean/Azure CloudConfigを生成するコマンドも含まれます(.serviceファイルを含む)。

341
mikemaccana

あなたはForeverを使うことができます。与えられたノードスクリプトが継続的に(すなわち永遠に)実行されることを確実にするためのシンプルなCLIツール: https://www.npmjs.org/package/forever

236
muzz

_ update _ - 以下の答えの1つで述べられているように、 PM2 は永遠から欠けているいくつかの本当に素晴らしい機能を持っています。それを使用することを検討してください。

元の回答

Nohup :を使用してください。

Nohup node server.js &

_ edit _ 私は、受け入れられた答えが本当に行くべき道であることを付け加えたいと思いました。私は立ち上がる必要があるインスタンスに永遠に使用しています。私はnpm install -g foreverをするのが好きですので、それはノードパスの中にあり、それからforever start server.jsをするだけです。

203
NG.

これは受け入れられた方法ではないかもしれませんが、私はそれを元に戻して必要に応じてそれを欺くことができるので、私は特に開発中にscreenでそれをします。

screen
node myserver.js
>>CTRL-A then hit D

画面が切り離され、ログオフしてもそのまま残ります。それから、screen -rを実行して元に戻すことができます。詳細はスクリーンのマニュアルを見てください。あなたはスクリーンに名前を付けることができ、あなたが好きなら何でもない。

60
Brent

2016アップデート: node-windows/mac/linuxシリーズはすべてのオペレーティングシステムで共通のAPIを使用しているので、絶対に関連性のある解決策です。しかしながら; node-linuxはsystemv initファイルを生成します。 systemdの人気が高まるにつれて、Linuxでは現実的にはより良い選択肢です。誰かがsystemdサポートをnode-linuxに追加したいならPRは大歓迎です:-)

元のスレッド:

これは今はかなり古いスレッドですが、 node-windows はWindows上でバックグラウンドサービスを作成する別の方法を提供します。これはおおまかにあなたのノードスクリプトの周りにnssmラッパーを使うというexe概念に基づいています。しかしながら;代わりにwinsw.exeを使用し、失敗時のプロセスの開始/停止方法をより詳細に制御するための構成可能なノードラッパーを提供します。これらのプロセスは、他のサービスと同じように利用できます。

enter image description here

このモジュールはまた、いくつかのイベントログを記録します。

enter image description here

あなたのスクリプトをデーモン化することはコードを通して達成されます。例えば:

var Service = require('node-windows').Service;

// Create a new service object
var svc = new Service({
  name:'Hello World',
  description: 'The nodejs.org example web server.',
  script: 'C:\\path\\to\\my\\node\\script.js'
});

// Listen for the "install" event, which indicates the
// process is available as a service.
svc.on('install',function(){
  svc.start();
});

// Listen for the "start" event and let us know when the
// process has actually started working.
svc.on('start',function(){
  console.log(svc.name+' started!\nVisit http://127.0.0.1:3000 to see it in action.');
});

// Install the script as a service.
svc.install();

このモジュールは、再起動の上限設定(悪いスクリプトではサーバーに影響を与えません)や再起動間の時間間隔の増加などをサポートします。

ノードウィンドウサービスは他のサービスと同じように動作するため、すでに使用しているソフトウェアを使用してサービスを管理/監視することができます。

最後に、make依存関係はありません。言い換えれば、簡単なnpm install -g node-windowsがうまくいくでしょう。これをインストールするのに、Visual Studio、.NET、またはnode-gypマジックは必要ありません。また、MITとBSDのライセンスがあります。

完全な開示では、私はこのモジュールの作者です。これは、OPが経験した正確な痛みを軽減するように設計されていますが、オペレーティングシステムがすでに提供している機能へのより緊密な統合を伴います。私はこの同じ質問を持つ将来の視聴者がそれが役に立つのを見つけることを望む。

59
Corey

_ update _ :pm2からの最新情報を含むように更新しました。

多くのユースケースでは、systemdサービスを使用することがノードプロセスを管理するための最も簡単で最も適切な方法です。単一の環境で多数のノードプロセスを実行している、または独立して実行されているノードマイクロサービスを実行しているユーザーには、pm2がより機能の充実したツールです。

https://github.com/unitech/pm2

http://pm2.io

  • それは本当に便利な監視機能を持っています - > pm2 monitで複数のプロセスのコマンドライン監視またはpm2 listでプロセスリストのための>かなり 'gui'
  • 整理されたログ管理 - > pm2 logs
  • 他のもの:
    • 動作設定
    • ソースマップのサポート
    • PaaS互換
    • 視聴&リロード
    • モジュールシステム
    • 最大メモリリロード
    • クラスタモード
    • ホットリロード
    • 開発ワークフロー
    • 起動スクリプト
    • 自動補完
    • 展開ワークフロー
    • キーメトリック監視
    • API
25
Hutch

OSXを実行している場合、真のシステムプロセスを生成する最も簡単な方法は、launchdを使用して起動することです。

このようなplistを作成し、top-level-domain.your-domain.application.plistという名前で/ Library/LaunchDaemonsに配置します(配置するときはrootになる必要があります)。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.Apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>top-level-domain.your-domain.application</string>

    <key>WorkingDirectory</key>
    <string>/your/preferred/workingdirectory</string>

    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/node</string>
        <string>your-script-file</string>
    </array>

    <key>RunAtLoad</key>
    <true/>

    <key>KeepAlive</key>
    <true/>

</dict>
</plist>

完了したら、これを(ルートとして)発行します。

launchctl load /Library/LaunchDaemons/top-level-domain.your-domain.application.plist
launchctl start top-level-domain.your-domain.application

そしてあなたは走っています。

また、再起動後も引き続き実行されます。

Plistの他のオプションについては、こちらのmanページをご覧ください。 https://developer.Apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html =

16

私は単に daemon npmモジュールを使っています。

var daemon = require('daemon');

daemon.daemonize({
    stdout: './log.log'
  , stderr: './log.error.log'
  }
, './node.pid'
, function (err, pid) {
  if (err) {
    console.log('Error starting daemon: \n', err);
    return process.exit(-1);
  }
  console.log('Daemonized successfully with pid: ' + pid);

  // Your Application Code goes here
});

最近私は mon(1) from TJ Holowaychuk を使って簡単なノードアプリを起動し管理しています。

13
LoG

スクリプトが完了するまで中断せずに単に実行したい場合は、ここでの回答で既に述べたようにnohopを使用できます。ただし、stdinstdoutも記録する完全なコマンドを提供する回答はありません。

Nohup node index.js >> app.log 2>&1 &
  • >>app.logに追加することを意味します。
  • 2>&1は、エラーがstdoutにも送信され、app.logに追加されるようにします。
  • 末尾の&は、現在の端末がコマンドから切断されていることを確認するので、作業を続けることができます。

ノードサーバー(またはサーバーの再起動時に起動するもの)を実行する場合は、 systemd/systemctl を使用してください。

13
Xeoncross

私は開発にスーパーバイザーを使います。それだけでうまくいきます。 .jsファイルに変更を加えるたびに、Supervisorはそれらの変更を読み込んで自動的にアプリを再起動します。

Githubページへのリンクです

インストールする:

SUDO npm install supervisor -g

-eを使えば他の拡張子も簡単に見られるようにすることができます。私がよく使用するもう1つのコマンドは、特定のフォルダーを無視するための-iです。

ログアウトした後でも、Nohupとsupervisorを使用してノードアプリをバックグラウンドで実行することができます。

Sudo Nohupスーパーバイザーmyapp.js&

12
Donald Gary

Nohupを使用している場合は、このコマンドを実行してみてください -

Nohup npm start 2>/dev/null 1>/dev/null&

サーバーを起動するために永遠に使うこともできます

forever start -c "npm start" ./ 

PM2はnpm startもサポートしています

pm2 start npm -- start
10
Himanshu Teotia

WINDOWS XP のバックグラウンドサービスとしてのNode.js

インストール:

  1. WGETをインストールする http://gnuwin32.sourceforge.net/packages/wget.htm インストーラーの実行可能ファイルを介して
  2. GITをインストールします http://code.google.com/p/msysgit/downloads/list インストーラの実行可能ファイルを使用して
  3. NSSMをインストールします http://nssm.cc/download/?page=download nnsm.exeを%windir%/ system32フォルダーにコピーする
  4. C:\ node\helloworld.jsを作成します。

    // http://howtonode.org/hello-node
    var http = require('http');
    var server = http.createServer(function (request, response) {
        response.writeHead(200, {"Content-Type": "text/plain"});
        response.end("Hello World\n");
    });
    server.listen(8000);
    console.log("Server running at http://127.0.0.1:8000/");
    
  5. コマンドコンソールを開き、次のように入力します(Resource Kitがインストールされている場合のみsetx)

    C:\node> set path=%PATH%;%CD%
    C:\node> setx path "%PATH%"
    C:\node> set NODE_PATH="C:\Program Files\nodejs\node_modules"
    C:\node> git config --system http.sslcainfo /bin/curl-ca-bundle.crt    
    C:\node> git clone --recursive git://github.com/isaacs/npm.git    
    C:\node> cd npm    
    C:\node\npm> node cli.js install npm -gf   
    C:\node> cd ..    
    C:\node> nssm.exe install node-helloworld "C:\Program Files\nodejs\node.exe" c:\node\helloworld.js    
    C:\node> net start node-helloworld
    
  6. 気の利いたバッチ商品はc:\ node\ServiceMe.cmdを作成することです。

    @echo off
    nssm.exe install node-%~n1 "C:\Program Files\nodejs\node.exe" %~s1
    net start node-%~n1
    pause
    

サービス管理:

  • サービス自体は、スタート - >ファイル名を指定して実行 - > services.mscまたはスタート - >ファイル名を指定して実行 - > MSCONFIG - >サービス(と 'Hide All Microsoft Services'の順に選択)からアクセス可能です。
  • このスクリプトは、バッチスクリプトで作成されたすべてのノードの先頭に「node-」を付けます。
  • 同様にそれらはレジストリにあります: " HKLM\SYSTEM\CurrentControlSet\Services\node-xxxx "
7
Page2PagePro

受け入れられた答えはおそらく最も良い本番の答えです、しかし開発作業をする簡単なハックのために、私はこれを見つけました:

nodejsが&を飲み込んでしまったため、nodejs scriptname.js &が機能しませんでした。そのため、scriptname.jsが死なずに端末を使用し続けられませんでした。

しかし、私はnodejs scriptname.jsを.shファイルに入れて、Nohup sh startscriptname.sh &はうまくいきました。

間違いなく生産的なことではありませんが、「私は自分の端末を使い続ける必要があり、5つの異なる端末を起動したくない」という問題を解決します。

7
ArtHare

あなたがLinuxサーバでnodejsを実行しているなら、私はこれが最良の方法だと思います。

サービススクリプトを作成して/etc/init/nodejs.confにコピーします。

サービス開始:Sudo service nodejs start

サービス停止:Sudo service nodejs stop

サービススクリプト

description "DManager node.js server - Last Update: 2012-08-06"
author      "Pedro Muniz - [email protected]"

env USER="nodejs" #you have to create this user 
env APPNAME="nodejs" #you can change the service name
env WORKDIR="/home/<project-home-dir>" #set your project home folder here
env COMMAND="/usr/bin/node <server name>" #app.js ?

# used to be: start on startup
# until we found some mounts weren't ready yet while booting:
start on started mountall
stop on shutdown

# Automatically Respawn:
respawn
respawn limit 99 5

pre-start script
    Sudo -u $USER echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> /var/log/$APPNAME.log
end script

script
    # Not sure why $HOME is needed, but we found that it is:
    export HOME="<project-home-dir>"  #set your project home folder here
    export NODE_PATH="<project node_path>"

    #log file, grant permission to nodejs user
    exec start-stop-daemon --start --make-pidfile --pidfile /var/run/$APPNAME.pid --chuid $USER --chdir $WORKDIR --exec $COMMAND >> /var/log/$APPNAME.log 2>&1
end script

post-start script
   # Optionally put a script here that will notifiy you node has (re)started
   # /root/bin/hoptoad.sh "node.js has started!"
end script

pre-stop script
    Sudo -u $USER echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> /var/log/$APPNAME.log
end script
4
Pedro Muniz

2017年6月更新:
Linux用のソリューション:(Red Hat)。以前のコメントは私にはうまくいきません。これはAmazon Web Service - Red Hat 7で私のために働きます。これがそこに誰かのために働くことを願っています。

A. Create the service file 
Sudo vi /etc/systemd/system/myapp.service
[Unit]
Description=Your app
After=network.target

[Service]
ExecStart=/home/ec2-user/meantodos/start.sh
WorkingDirectory=/home/ec2-user/meantodos/

[Install]
WantedBy=multi-user.target

B. Create a Shell file
/home/ec2-root/meantodos/start.sh
#!/bin/sh -
Sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080
npm start

then:
chmod +rx /home/ec2-root/meantodos/start.sh
(to make this file executable)

C. Execute the Following

Sudo systemctl daemon-reload
Sudo systemctl start myapp
Sudo systemctl status myapp

(If there are no errors, execute below.  Autorun after server restarted.)
chkconfig myapp -add
3
Eman Jayme

nssm Windows用の最善の解決策を使用し、 nssm をダウンロードし、cmdをnssmディレクトリに開いて次のように入力します。

nssm install <service name> <node path> <app.js path> 

eg: nssm install myservice "C:\Program Files\nodejs" "C:\myapp\app.js" 

これは services.msc に一覧表示される新しいwindowsサービスをインストールします。そこからサービスを開始または停止できます。このサービスは自動的に開始され、失敗した場合は再起動するように設定できます。

3
Aun Rizvi

提案されているさまざまなオプションをまとめるために、もう1つ、GNU/Linuxのdaemonコマンドがあります。これについては、 http://libslack.org/daemon/manpages/daemon.1.html 。 (これが上記のコメントの1つですでに言及されている場合は謝罪)。

2
ravi

誰かが "2>&1"の位置を誤って認識したことがありますか?

2>&1 >> file

あるべき

>> file 2>&1
1
osexp2003

フーガをチェック!多くのワーカーを立ち上げることとは別に、あなたもあなたのノードプロセスを悪魔化することができます!

http://github.com/pgte/fugue

1
Shripad Krishna

私はtmuxをリモートホストのマルチウィンドウ/ペイン開発環境に使います。プロセスを切り離してバックグラウンドで実行し続けることは本当に簡単です。 tmux をご覧ください。

1
Karl Pokus

daemon npmモジュールの新しいバージョンを使っている人のために - あなたは文字列の代わりにファイルディスクリプタを渡す必要があります:

var fs = require('fs');
var stdoutFd = fs.openSync('output.log', 'a');
var stderrFd = fs.openSync('errors.log', 'a');
require('daemon')({
    stdout: stdoutFd, 
    stderr: stderrFd
});
0
Viktor Nonov

PM2は、ロードバランサを内蔵したNode.jsアプリケーションのプロダクションプロセスマネージャです。これにより、アプリケーションを永久に存続させ、ダウンタイムなしでそれらをリロードし、一般的なシステム管理作業を容易にすることができます。 https://github.com/Unitech/pm2

0
Arezki Lebdiri

誰も言及していないことに私は驚いています Guvnor

私は永久にpm2などを試してみました。しかし、それがしっかりとしたコントロールとウェブベースのパフォーマンス測定基準に関しては、私は Guvnor がはるかに最高であるとわかりました。さらに、それはまた完全にオープンソースです。

enter image description here

編集:しかしながら、私はそれがウィンドウズ上で動くのかどうかわからない。私はLinux上でしか使っていません。

0
Josh

この答えは当事者にはかなり手遅れですが、最良の解決策はscreen -dmSNohupの両方のコマンドを使用したシェルスクリプトを書くことであることがわかりました。

screen -dmS newScreenName Nohup node myserver.js >> logfile.log

また、最後に>> logfileビットを追加して、ノードのconsole.log()ステートメントを簡単に保存できるようにします。

シェルスクリプトを使用したのはなぜですか? node myserver.jsプロセスがすでに実行されているかどうかを確認するifステートメントを追加しました。

そのようにして私はサーバーを動かし続けることも、変更を加えたときに再起動することもできる単一のコマンドラインオプションを作成することができました。これは開発に非常に役立ちます。