586

この投稿は何年にもわたって多くの注目を集めているので、この投稿の下部にプラットフォームごとのトップソリューションをリストしました。


元の投稿

node.jsサーバーをバックグラウンドで実行したい。つまり、ターミナルを閉じたときにサーバーを実行し続けたい。私はこれをグーグルで検索してこのチュートリアルを思いついたが、意図したとおりに機能しない。そのため、そのデーモンスクリプトを使用する代わりに、出力リダイレクト(一部)を使用したと思いまし2>&1 >> fileたが、これも終了しません-出力/エラーを待機しているように、端末に空白行が表示されます。

プロセスをバックグラウンドに配置しようとしましたが、ターミナルを閉じるとすぐにプロセスも強制終了されます。

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


トップソリューション

4

28 に答える 28

534

Node.jsアプリケーションを独自のプロセスとして実行するにはどうすればよいですか

2015年の回答:ほぼすべてのLinuxディストリビューションにsystemdが付属しています。つまり、monit、PM2などは不要になりました。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 nodechmod +x myapp.js

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

で開始しsystemctl start myappます。

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

ログを見るjournalctl -u myapp

これは、Linuxでノードアプリをデプロイする方法、2018年版.serviceから引用したもので、Linux /ノードサーバー(ファイルを含む)を構築するためのAWS / DigitalOcean /AzureCloudConfigを生成するコマンドも含まれています。

于 2015-03-13T22:23:06.197 に答える
247

Foreverを使用できます。これは、特定のノードスクリプトが継続的に(つまり、永久に)実行されるようにするためのシンプルなCLIツールです: https ://www.npmjs.org/package/forever

于 2011-03-18T01:49:17.443 に答える
234

更新-以下の回答の1つで述べたように、PM2には、永遠に欠けているいくつかの本当に素晴らしい機能があります。使用を検討してください。

元の回答

nohupを使用してください:

nohup node server.js &

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

于 2010-10-25T19:43:12.920 に答える
72

これは受け入れられない方法かもしれませんが、特に開発中は、必要に応じて画面を元に戻してだますことができるので、画面を使用して行います。

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

画面が切り離され、ログオフしても存続します。次に、screen-rを実行して元に戻すことができます。詳細については、画面のマニュアルを参照してください。必要に応じて、画面に名前を付けることができます。

于 2010-10-25T19:42:57.867 に答える
68

2016年の更新: node-windows / mac / linuxシリーズは、すべてのオペレーティングシステムで共通のAPIを使用しているため、絶対に関連するソリューションです。でも; node-linuxはsystemvinitファイルを生成します。systemdの人気が高まり続ける中、Linuxでは現実的に優れたオプションです。node-linuxにsystemdサポートを追加したい場合は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();

このモジュールは、再起動の制限(不適切なスクリプトがサーバーに影響を与えないようにする)や再起動間の時間間隔の拡大などをサポートします。

node-windowsサービスは他のサービスと同じように実行されるため、すでに使用しているソフトウェアを使用してサービスを管理/監視することができます。

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

完全な開示では、私はこのモジュールの作者です。これは、OPが経験した正確な苦痛を和らげるために設計されましたが、オペレーティングシステムがすでに提供している機能へのより緊密な統合を備えています。これと同じ質問をする将来の視聴者がそれが役立つことを願っています。

于 2013-03-25T14:03:13.813 に答える
41

スクリプトが完了するまで中断せずにスクリプトを実行したいだけの場合はnohup、ここの回答ですでに述べたように使用できます。stdinただし、どの回答も、ログとを記録する完全なコマンドを提供していませんstdout

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

ノードサーバー(またはサーバーの再起動時にバックアップを開始する必要があるもの)を実行する場合は、systemd/systemctlを使用する必要があります。

于 2017-10-13T15:05:26.327 に答える
31

更新:pm2からの最新のものを含めるように更新しました:

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

https://github.com/unitech/pm2

http://pm2.io

  • それは本当に便利な監視機能を持っています->複数のプロセスのコマンドライン監視pm2 monitまたはプロセスリストのためのかなりの「gui」pm2 list
  • 整理されたログ管理->pm2 logs
  • 他のもの:
    • 動作構成
    • ソースマップのサポート
    • PaaS互換
    • ウォッチ&リロード
    • モジュールシステム
    • 最大メモリリロード
    • クラスターモード
    • ホットリロード
    • 開発ワークフロー
    • スタートアップスクリプト
    • オートコンプリート
    • 展開ワークフロー
    • キーメトリクスモニタリング
    • API
于 2013-06-09T02:45:16.653 に答える
22

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

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

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

forever start -c "npm start" ./ 

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

pm2 start npm -- start
于 2016-03-02T04:22:40.880 に答える
20

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

このようなplistを作成し、それを/ Library / LaunchDaemonsに名前を付けてtop-level-domain.your-domain.application.plist配置します(配置するときは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

于 2014-09-23T15:00:07.450 に答える
13

私は単にデーモン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
});

最近、TJ Holowaychukのmon(1)を使用して、単純ノードアプリを起動および管理しています。

于 2012-07-24T14:21:00.337 に答える
12

開発にはSupervisorを使用しています。それはうまくいきます。.jsファイルに変更を加えると、Supervisorはそれらの変更が読み込まれた状態でアプリを自動的に再起動します。

Githubページへのリンクは次のとおりです

インストール :

sudonpmインストールスーパーバイザー-g

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

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

sudo nohupスーパーバイザーmyapp.js&

于 2013-07-16T17:25:05.090 に答える
7

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

  • Kudosは、 Windows用のNode.js + npmのインストールのチュートリアルについて、http://www.hacksparrow.com/install-node-js-and-npm-on-windows.htmlのHacksparrowにアクセスします。
  • Kudosは、nnsm.exeの実装について、http://blog.tatham.oddie.com.au/2011/03/16/node-js-on-windows/のTathamOddieにアクセスします。

インストール:

  1. インストーラーの実行可能ファイルを介してWGEThttp ://gnuwin32.sourceforge.net/packages/wget.htmをインストールします
  2. インストーラー実行可能ファイルを介してGIThttp ://code.google.com/p/msysgit/downloads/listをインストールします
  3. nnsm.exeを%windir%/ system32フォルダーにコピーして、 NSSMhttp : //nssm.cc/download/?page=downloadをインストールします。
  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. コマンドコンソールを開き、次のように入力します(リソースキットがインストールされている場合のみ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]-> [サービス]からアクセスできます([すべてのMicrosoftサービスを非表示]をオンにします)。
  • スクリプトは、バッチスクリプトを介して作成されたすべてのノードの前に「node-」を付けます。
  • 同様に、それらはレジストリにあります: " HKLM \ SYSTEM \ CurrentControlSet \ Services \ node-xxxx "
于 2012-10-18T16:26:26.650 に答える
7

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

nodejs scriptname.js &nodejsが&を食いつぶしているように見えたため、動作しませんでした。そのため、scriptname.jsが停止せずにターミナルを使い続けることができませんでした。

しかし、私nodejs scriptname.jsは.shファイル を入れてnohup sh startscriptname.sh &作業しました。

確かに本番環境ではありませんが、「端末を使い続ける必要があり、5つの異なる端末を起動したくない」という問題は解決します。

于 2016-03-22T18:47:05.963 に答える
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
于 2014-09-03T12:46:42.527 に答える
5

2017年6月の更新:
Linux用のソリューション:(レッドハット)。以前のコメントは私にはうまくいきません。これは、Amazon Web Service-RedHat7で機能します。これが誰かに機能することを願っています。

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
于 2017-06-27T10:40:30.870 に答える
3

Windowsに最適なソリューションであるnssmを使用し、 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サービスがインストールされ、そこからサービスを開始または停止できます。このサービスは自動的に開始され、失敗した場合に再起動するように構成できます。

于 2014-03-21T12:20:03.617 に答える
2

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

于 2013-06-04T04:16:08.017 に答える
2

提供された回答のリストにこのオプションがないため、2020年の時点で適格なオプション( dockerまたは同等の コンテナープラットフォーム)を追加したいと思います。アプリケーションが安定した環境で動作していることを確認することに加えて、追加のセキュリティ上の利点と改善された移植性があります。

Windows、macOS、およびほとんど/主要なLinuxディストリビューションのDockerサポートがあります。サポートされているプラ​​ットフォームへのDockerのインストールは、かなり簡単で、十分に文書化されています。Node.jsアプリケーションのセットアップは、コンテナーに入れてそのコンテナーを実行し、シャットダウン後に再起動されることを確認するのと同じくらい簡単です。

コンテナイメージの作成

アプリケーションがそのサーバーの/home/ me / my-appで利用可能であると仮定して、次のようなコンテンツを含むテキストファイルDockerfileをフォルダー/ home/meに作成します。

FROM node:lts-alpine
COPY /my-app/ /app/
RUN cd /app && npm ci
CMD ["/app/server.js"]

Alpine LinuxでLTSバージョンのNode.jsを実行するためのイメージを作成し、アプリケーションのファイルをイメージにコピーして実行npm ciし、依存関係がそのランタイムコンテキストと一致していることを確認します。

同じフォルダにコンテンツを含む別のファイル.dockerignoreを作成します

**/node_modules

これにより、ホストシステムの既存の依存関係がコンテナで機能しない可能性があるため、コンテナに注入されるのを防ぐことができます。Dockerfileで提示されたRUNコマンドはそれを修正しようとしています。

次のようなコマンドを使用してイメージを作成します。

docker build -t myapp-as-a-service /home/me

オプションは、-tビルドされたコンテナイメージの「名前」を選択することです。これは、以下の実行中のコンテナーで使用されます。

注:最後のパラメーターは、Dockerfile自体ではなく、そのDockerfileを含むフォルダーを選択することです。オプションを使用して別のものを選択できます-f

コンテナを開始

コンテナを起動するには、次のコマンドを使用します。

docker run -d --restart always -p 80:3000 myapp-as-a-service

このコマンドは、アプリがポート3000でリッスンしていて、ホストのポート80で公開することを想定しています。

これは確かに非常に限られた例ですが、良い出発点です。

于 2020-01-01T10:12:21.843 に答える
1

フーガをチェックしてください!多くのワーカーを起動するだけでなく、ノードプロセスをデモンストレーションすることもできます。

http://github.com/pgte/fugue

于 2010-10-26T05:10:05.560 に答える
1

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

于 2015-10-09T19:15:45.193 に答える
1

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

私は永遠に、pm2などを試しました。しかし、堅実な制御とWebベースのパフォーマンスメトリックに関しては、Guvnorが群を抜いて最高であることがわかりました。さらに、完全にオープンソースでもあります。

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

編集:しかし、それがウィンドウズで動作するかどうかはわかりません。私はLinuxでのみ使用しました。

于 2015-10-24T15:23:24.027 に答える
1

「2>&1」の位置の些細な間違いに気づいた人はいますか?

2>&1 >> file

する必要があります

>> file 2>&1
于 2016-02-20T13:49:56.320 に答える
1

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

于 2017-03-07T08:52:17.947 に答える
1

新しいバージョンのデーモン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
});
于 2018-10-13T18:49:44.480 に答える
1

pm2を使用している場合は、次のようにautorestart設定して使用できfalseます。

$pm2エコシステム

これにより、サンプルが生成されますecosystem.config.js

module.exports = {
  apps: [
    {
      script: './scripts/companies.js',
      autorestart: false,
    },
    {
      script: './scripts/domains.js',
      autorestart: false,
    },
    {
      script: './scripts/technologies.js',
      autorestart: false,
    },
  ],
}

$pm2はecosystem.config.jsを開始します

于 2020-06-06T14:32:17.637 に答える
1

RHEL 8 AWS EC2インスタンスで@mikemaccanaの承認された回答を使用すると、次のエラーが発生しました。(code=exited, status=216/GROUP)

これは、「nobody」に設定されたユーザー/グループを使用したためです。

グーグルすると、UNIXスタック交換でここで回答されているように、ユーザー/グループを「nobody」/「nogroup」として使用することはデーモンにとって悪い習慣のようです。

ユーザー/グループを実際のユーザーとグループに設定した後は、うまく機能しました。

これを修正するために利用可能なオプションを入力whomaiして確認できます。groups

mongodbを使用したフルスタックノードアプリのサービスファイル:

[Unit]
Description=myapp
After=mongod.service

[Service]
ExecStart=/home/myusername/apps/myapp/root/build/server/index.js
Restart=always
RestartSec=30
User=myusername
Group=myusername
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/home/myusername/apps/myapp

[Install]
WantedBy=multi-user.target
于 2021-08-13T19:26:18.313 に答える
1

pm2モジュールを使用します。pm2nodejsモジュール

于 2021-09-07T06:41:21.337 に答える
-1

この答えはパーティーにはかなり遅れていますが、最善の解決策は、screen -dmSnohupコマンドの両方を使用するシェルスクリプトを作成することであることがわかりました。

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

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

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

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

于 2012-04-19T15:00:29.513 に答える