バックグラウンドサービスとしてnode.jsアプリを実行する方法
この記事は長年にわたって多くの注目を集めてきたので、私はこの記事の最後にプラットフォームごとのトップソリューションをリストしました。
元の投稿 :
Node.jsサーバーをバックグラウンドで実行したいのです。つまり、端末を閉じたときに、サーバーを実行し続けたいのです。私はこれをグーグルしてこの チュートリアル を思い付きました、しかしそれは意図したようには動作しません。それで、そのデーモンスクリプトを使う代わりに、私はちょうど出力リダイレクション(2>&1 >> file
部分)を使ったと思いました、しかしこれもまた終わりません - 私はそれが出力/エラーを待っているように私の端末に空白行を得ます。
プロセスをバックグラウンドで実行しようとしましたが、端末を閉じるとすぐにプロセスも終了します。
それでは、ローカルコンピュータをシャットダウンしたときにどのように実行したままにすることができますか?
トップソリューション :
- Systemd (Linux)
- 起動済み (Mac)
- node-windows (Windows)
- PM2 (Node.js)
から自分の答えをコピーする 自分のプロセスとして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
ファイルを含む)。
あなたはForeverを使うことができます。与えられたノードスクリプトが継続的に(すなわち永遠に)実行されることを確実にするためのシンプルなCLIツール: https://www.npmjs.org/package/forever
_ update _ - 以下の答えの1つで述べられているように、 PM2 は永遠から欠けているいくつかの本当に素晴らしい機能を持っています。それを使用することを検討してください。
元の回答
Nohup :を使用してください。
Nohup node server.js &
_ edit _ 私は、受け入れられた答えが本当に行くべき道であることを付け加えたいと思いました。私は立ち上がる必要があるインスタンスに永遠に使用しています。私はnpm install -g forever
をするのが好きですので、それはノードパスの中にあり、それからforever start server.js
をするだけです。
これは受け入れられた方法ではないかもしれませんが、私はそれを元に戻して必要に応じてそれを欺くことができるので、私は特に開発中にscreenでそれをします。
screen
node myserver.js
>>CTRL-A then hit D
画面が切り離され、ログオフしてもそのまま残ります。それから、screen -rを実行して元に戻すことができます。詳細はスクリーンのマニュアルを見てください。あなたはスクリーンに名前を付けることができ、あなたが好きなら何でもない。
2016アップデート: node-windows/mac/linuxシリーズはすべてのオペレーティングシステムで共通のAPIを使用しているので、絶対に関連性のある解決策です。しかしながら; node-linuxはsystemv initファイルを生成します。 systemdの人気が高まるにつれて、Linuxでは現実的にはより良い選択肢です。誰かがsystemdサポートをnode-linuxに追加したいならPRは大歓迎です:-)
元のスレッド:
これは今はかなり古いスレッドですが、 node-windows はWindows上でバックグラウンドサービスを作成する別の方法を提供します。これはおおまかにあなたのノードスクリプトの周りにnssm
ラッパーを使うというexe
概念に基づいています。しかしながら;代わりにwinsw.exe
を使用し、失敗時のプロセスの開始/停止方法をより詳細に制御するための構成可能なノードラッパーを提供します。これらのプロセスは、他のサービスと同じように利用できます。
このモジュールはまた、いくつかのイベントログを記録します。
あなたのスクリプトをデーモン化することはコードを通して達成されます。例えば:
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が経験した正確な痛みを軽減するように設計されていますが、オペレーティングシステムがすでに提供している機能へのより緊密な統合を伴います。私はこの同じ質問を持つ将来の視聴者がそれが役に立つのを見つけることを望む。
_ update _ :pm2からの最新情報を含むように更新しました。
多くのユースケースでは、systemdサービスを使用することがノードプロセスを管理するための最も簡単で最も適切な方法です。単一の環境で多数のノードプロセスを実行している、または独立して実行されているノードマイクロサービスを実行しているユーザーには、pm2がより機能の充実したツールです。
https://github.com/unitech/pm2
- それは本当に便利な監視機能を持っています - >
pm2 monit
で複数のプロセスのコマンドライン監視またはpm2 list
でプロセスリストのための>かなり 'gui' - 整理されたログ管理 - >
pm2 logs
- 他のもの:
- 動作設定
- ソースマップのサポート
- PaaS互換
- 視聴&リロード
- モジュールシステム
- 最大メモリリロード
- クラスタモード
- ホットリロード
- 開発ワークフロー
- 起動スクリプト
- 自動補完
- 展開ワークフロー
- キーメトリック監視
- API
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 =
私は単に 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 を使って簡単なノードアプリを起動し管理しています。
スクリプトが完了するまで中断せずに単に実行したい場合は、ここでの回答で既に述べたようにnohop
を使用できます。ただし、stdin
とstdout
も記録する完全なコマンドを提供する回答はありません。
Nohup node index.js >> app.log 2>&1 &
>>
はapp.log
に追加することを意味します。2>&1
は、エラーがstdout
にも送信され、app.log
に追加されるようにします。- 末尾の
&
は、現在の端末がコマンドから切断されていることを確認するので、作業を続けることができます。
ノードサーバー(またはサーバーの再起動時に起動するもの)を実行する場合は、 systemd/systemctl を使用してください。
私は開発にスーパーバイザーを使います。それだけでうまくいきます。 .jsファイルに変更を加えるたびに、Supervisorはそれらの変更を読み込んで自動的にアプリを再起動します。
インストールする:
SUDO npm install supervisor -g
-eを使えば他の拡張子も簡単に見られるようにすることができます。私がよく使用するもう1つのコマンドは、特定のフォルダーを無視するための-iです。
ログアウトした後でも、Nohupとsupervisorを使用してノードアプリをバックグラウンドで実行することができます。
Sudo Nohupスーパーバイザーmyapp.js&
Nohupを使用している場合は、このコマンドを実行してみてください -
Nohup npm start 2>/dev/null 1>/dev/null&
サーバーを起動するために永遠に使うこともできます
forever start -c "npm start" ./
PM2はnpm start
もサポートしています
pm2 start npm -- start
WINDOWS XP のバックグラウンドサービスとしてのNode.js
- KudosはHacksparrowに行きます: http://www.hacksparrow.com/install-node-js-and-npm-on-windows.html Node.jsをインストールするチュートリアル+ windows for npm。
- KudosはTatham Oddieに行きます: http://blog.tatham.oddie.com.au/2011/03/16/node-js-on-windows/ nnsm.exeの実装。
インストール:
- WGETをインストールする http://gnuwin32.sourceforge.net/packages/wget.htm インストーラーの実行可能ファイルを介して
- GITをインストールします http://code.google.com/p/msysgit/downloads/list インストーラの実行可能ファイルを使用して
- NSSMをインストールします http://nssm.cc/download/?page=download nnsm.exeを%windir%/ system32フォルダーにコピーする
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/");
コマンドコンソールを開き、次のように入力します(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
気の利いたバッチ商品は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 "
受け入れられた答えはおそらく最も良い本番の答えです、しかし開発作業をする簡単なハックのために、私はこれを見つけました:
nodejsが&を飲み込んでしまったため、nodejs scriptname.js &
が機能しませんでした。そのため、scriptname.jsが死なずに端末を使用し続けられませんでした。
しかし、私はnodejs scriptname.js
を.shファイルに入れて、Nohup sh startscriptname.sh &
はうまくいきました。
間違いなく生産的なことではありませんが、「私は自分の端末を使い続ける必要があり、5つの異なる端末を起動したくない」という問題を解決します。
あなたが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 - pedro.muniz@geeklab.com.br"
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
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
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サービスをインストールします。そこからサービスを開始または停止できます。このサービスは自動的に開始され、失敗した場合は再起動するように設定できます。
提案されているさまざまなオプションをまとめるために、もう1つ、GNU/Linuxのdaemon
コマンドがあります。これについては、 http://libslack.org/daemon/manpages/daemon.1.html 。 (これが上記のコメントの1つですでに言及されている場合は謝罪)。
誰かが "2>&1"の位置を誤って認識したことがありますか?
2>&1 >> file
あるべき
>> file 2>&1
フーガをチェック!多くのワーカーを立ち上げることとは別に、あなたもあなたのノードプロセスを悪魔化することができます!
私はtmuxをリモートホストのマルチウィンドウ/ペイン開発環境に使います。プロセスを切り離してバックグラウンドで実行し続けることは本当に簡単です。 tmux をご覧ください。
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
});
PM2は、ロードバランサを内蔵したNode.jsアプリケーションのプロダクションプロセスマネージャです。これにより、アプリケーションを永久に存続させ、ダウンタイムなしでそれらをリロードし、一般的なシステム管理作業を容易にすることができます。 https://github.com/Unitech/pm2
この答えは当事者にはかなり手遅れですが、最良の解決策はscreen -dmS
とNohup
の両方のコマンドを使用したシェルスクリプトを書くことであることがわかりました。
screen -dmS newScreenName Nohup node myserver.js >> logfile.log
また、最後に>> logfile
ビットを追加して、ノードのconsole.log()
ステートメントを簡単に保存できるようにします。
シェルスクリプトを使用したのはなぜですか? node myserver.js
プロセスがすでに実行されているかどうかを確認するifステートメントを追加しました。
そのようにして私はサーバーを動かし続けることも、変更を加えたときに再起動することもできる単一のコマンドラインオプションを作成することができました。これは開発に非常に役立ちます。