Node.jsをバックグラウンドプロセスとして実行して死なない方法


480

パテSSH経由でLinuxサーバーに接続します。私はそれをこのようなバックグラウンドプロセスとして実行しようとしました:

$ node server.js &

ただし、2.5時間後、ターミナルは非アクティブになり、プロセスは終了します。とにかくターミナルが切断されていてもプロセスを存続させることができますか?


編集1

実際、私はを試しましたnohupが、Putty SSHターミナルを閉じるかインターネットのプラグを抜くとすぐに、サーバープロセスはすぐに停止します。

パテでやらなければならないことはありますか?


編集2(2012年2月)

永遠にnode.jsモジュールがあります。node.jsサーバーをデーモンサービスとして実行します。


7
私の場合、と入力してターミナルを終了するとnohupが機能しますexit。Puttyウィンドウを閉じると失敗します。
Pawel Furmaniak 2013年

回答:


513

簡単な解決策(プロセスに戻ることに関心がない場合は、実行を続けたいだけです):

nohup node server.js &

jobsこれらのバックグラウンドプロセスのインデックス付きリストを表示するコマンドもあります。また、バックグラウンドプロセスを実行するkill %1kill %2、その番号をプロセスのインデックスとして、強制終了できます。

強力なソリューション(対話型の場合はプロセスに再接続できます):

screen

次に、Ctrl + a + dを押してデタッチし、実行して元に戻すことができます screen -r

また、画面の新しい代替手段であるtmuxも検討してください。


1
それで、「画面」を実行する場合、画面を作成してその内部で実行しますよね?
murvinlai 2011年

30
はい。Ctrl+ a、dを押して切り離し、screen -r
MKを

1
@murvinlai EC2は環境であり、root権限とは何の関係もありません。それはおそらくあなたのAMIについてです。たとえば、Amazon AMIを使用すると、確実にできsudo bashます。
ShuaiYuan 2013

1
man bash:コマンドが制御演算子&で終了した場合、シェルはサブシェルのバックグラウンドでコマンドを実行します。シェルは、仕上げにCOM- MANDを待たず、戻りステータスは0です
MK。

34
これを読んでいる人には、スクリーンまたはtmuxセッション内でnode.jsサーバーを実行することがAMATEURソリューションです!簡単なテストでない限り、これを行わないでください。プロセスを実行し続けるには、デーモン化する必要があります!それに対応する適切なツールを使用しますたとえばpm2やプレーンなinit.dスクリプトなどです。
ビクターシュレーダー

1119

nohup node server.js > /dev/null 2>&1 &

  1. nohup意味:sttyが切断されていても、このプロセスを終了しないでください。
  2. > /dev/nullつまり、stdoutは/ dev / null(出力を記録しないダミーデバイス)に移動します。
  3. 2>&1つまり、stderrはstdoutにも移動します(すでにリダイレクトされています/dev/null)。エラーのログを保持するために、&1をファイルパスに置き換えることができます。例:2>/tmp/myLog
  4. &最後は、このコマンドをバックグラウンドタスクとして実行することを意味します。

49
これは、現在受け入れられているものよりもはるかに高品質であるため、受け入れられた答えになるはずです。
L0j1k 2014

2
@ L0j1kは議論の余地がありますが、OPは、受け入れられた回答には少し詳しい説明が必要であることをある程度理解しています。
JFA 2014年

41
SOはOPの問題ではなく、OPの質問に助けを求める何千人もの人々の問題です。
L0j1k 2014年

3
stdoutとstderrをリダイレクトする必要がありますか?それらをまったくリダイレ​​クトしなかった場合も同様に機能しますか?または、それらをファイルにリダイレクトした場合はどうなりますか?
Shawn

10
stdoutとstderrをに送信し/dev/nullますか?ニースのログ...これをデバッグしようとしている幸運...
ビクターシュレーダー

138

あなたは本当に使用してみてくださいscreen。ただ行うよりも少し複雑nohup long_running &ですが、二度と戻ってこない画面を理解すること。

最初にスクリーンセッションを開始します。

user@host:~$ screen

好きなものを実行します

wget http://mirror.yandex.ru/centos/4.6/isos/i386/CentOS-4.6-i386-binDVD.iso

Ctrl + Aを押してから、dを押します。できました。セッションはバックグラウンドで続行されます。

すべてのセッションをで一覧表示しscreen -lsscreen -r 20673.pts-0.srvコマンドでアタッチすることができます。0673.pts-0.srvはエントリリストです。


125

これは古い質問ですが、Googleで上位にランクされています。フラグ&を付けて、またはnohupフラグを付けてさえも、screenセッション内でnode.jsプロセスを実行することは、単なる回避策であるため、私はほとんど最高の投票された答えを信じることができません。

特にscreen / tmuxソリューション。これは本当にアマチュアソリューションと見なされます。ScreenとTmuxは、プロセスの実行を維持するためのものではなく、ターミナルセッションの多重化のためのものです。サーバーでスクリプトを実行していて、切断する場合は問題ありません。しかし、node.jsサーバーの場合、プロセスをターミナルセッションにアタッチしたくない場合があります。これは壊れやすいです。実行を続けるには、プロセスをデーモン化する必要があります!

それを行うための良いツールがたくさんあります。

PM2http : //pm2.keymetrics.io/

# basic usage
$ npm install pm2 -g
$ pm2 start server.js

# you can even define how many processes you want in cluster mode:
$ pm2 start server.js -i 4

# you can start various processes, with complex startup settings
# using an ecosystem.json file (with env variables, custom args, etc):
$ pm2 start ecosystem.json

私がPM2を支持する大きな利点の1つは、システムの起動スクリプトを生成して、再起動間でプロセスを維持できることです。

$ pm2 startup [platform]

どこにplatformすることができますubuntu|centos|redhat|gentoo|systemd|darwin|amazon

forever.jshttps : //github.com/foreverjs/forever

# basic usage
$ npm install forever -g
$ forever start app.js

# you can run from a json configuration as well, for
# more complex environments or multi-apps
$ forever start development.json

初期化スクリプト

initスクリプトの作成方法については詳しく説明しません。私はこのテーマの専門家ではないため、この回答には長すぎますが、基本的には、OSイベントによってトリガーされる単純なシェルスクリプトです。これについて詳しくは、こちらをご覧ください

Docker

ちょうどとドッカーコンテナでサーバーを実行する-dオプションと、出来上がり、あなたはデーモン化のNode.jsサーバーを持っています!

以下は、サンプルのDockerfileです(node.js 公式ガイドから):

FROM node:argon

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install

# Bundle app source
COPY . /usr/src/app

EXPOSE 8080
CMD [ "npm", "start" ]

次に、イメージをビルドしてコンテナを実行します。

$ docker build -t <your username>/node-web-app .
$ docker run -p 49160:8080 -d <your username>/node-web-app

これが誰かがこのページに着陸するのに役立つことを願っています。常に適切なツールを使用してください。それはあなたに多くの頭痛と時間を節約します!


2
これは私が探していたものです。pm2ソリューションで、後で端末を接続する方法はありますか?
Quantumplation 2016

4
@Quantumplation、いいえ。プロセスがインタラクティブセッションで実行されていないため、これは不可能です。しかしtail -f、pm2が生成するログファイルを使用することで、同じ「感覚」を得ることができます。
VictorSchröder16年

1
あなたscreenは多くの人が見つけている解決策が仕事をすることを指定します回避策です。特定のタスクを達成する方法はたくさんあります。(特定の質問を考えると)たまたまrun as background and never die、多くの人にとって卓越した特定のタスクを達成していると思います。また、必要に応じて、ユーザーが戻ってやり取りしたり変更したりできるようにするというボーナスも追加されています。重要なのは、コンポーネントbackgroundnever dieです。すべてのソリューションには一定のボーナスがあります。
LDジェームズ

@Rakshith Ravi-同意しません。これらはすべて、追加のダウンロード/ソフトウェア/ツールが必要です(ソリューションが提供されていない初期化ソリューションを除く)。これnohup 解決策です。それはLinuxに組み込まれていて、そのためにあります。それは1行で、クリーンで、更新に関係なく、常に意図したとおりに機能します。このような基本的な使用例では、サードパーティのツールを使用しないようにしてください。Dockerの例(たとえば)は、上位投票の回答の1つの単純なコマンドよりもはるかに冗長でリソースを消費します。Dockerは大好きですが、これは好きではありません。
Jack_Hu

1
@Jack_Hu、私はオーバーヘッドについて疑いの余地nohupはありませんが、ソリューションは「死なない」という要件を満たしていません。非常にトリッキーtrapまたはハックな無限ループを記述しない限り、この目的のために特別に記述されたツール(またはもちろん、自分で記述したinitスクリプト)を使用せずにプロセスをデーモン化しておく方法はわかりません。
VictorSchröder18年

24

別の解決策は仕事を捨てる

$ nohup node server.js &
[1] 1711
$ disown -h %1

disownはまさに私が探していたものですが、-hフラグは何をしますか?私はそれをマニュアルで見つけることができません
リマンタスジャシケビキウス

manページから:-hオプションが指定されている場合、各jobspecはテーブルから削除されませんが、シェルがSIGHUPを受信した場合にSIGHUPがジョブに送信されないようにマークされます。jobspecが指定されていない場合、-aオプションはすべてのジョブを削除またはマークすることを意味します。
myururdurmaz

14

nohup端末が停止した後でもプログラムを続行できます。実際にnohup、SSHセッションが正しく終了しない状況が発生したため、入力もリダイレクトする必要があります。

$ nohup node server.js </dev/null &

nohup構成方法によっては、標準出力と標準エラーをファイルにリダイレクトする必要がある場合もあります。


7

私のシェルのrcファイルには、@ Yoichiの回答に基づいてこの関数があります。

nohup-template () {
    [[ "$1" = "" ]] && echo "Example usage:\nnohup-template urxvtd" && return 0
    nohup "$1" > /dev/null 2>&1 &
}

次のように使用できます。

nohup-template "command you would execute here"

7

Nohupとscreenは、Node.jsをバックグラウンドで実行するための優れたソリューションを提供します。Node.jsプロセスマネージャー(PM2)は、展開に便利なツールです。npmを使用してシステムにグローバルにインストールします。

npm install pm2 -g

Node.jsアプリをデーモンとして実行するには:

pm2 start app.js

オプションで、Unitechが作成した監視SAASであるKeymetrics.ioにリンクできます。


6
$ disown node server.js &

アクティブなタスクリストからコマンドを削除し、コマンドをバックグラウンドに送信します



3

sysv initを使用してdebianでシステムサービスとしてコマンドを実行するには:

スケルトンスクリプトをコピーし、ニーズに合わせて調整します。おそらく、いくつかの変数を設定するだけです。/lib/init/init-d-script何かがニーズに合わない場合、スクリプトはからデフォルトを継承します-スクリプトでオーバーライドします。問題が発生した場合は、ソースで詳細を確認できます/lib/init/init-d-script。必須VARSがあるDAEMONNAME。スクリプトはstart-stop-daemonコマンドを実行するために使用します。使用START_ARGSする追加のパラメーターを定義できますstart-stop-daemon

cp /etc/init.d/skeleton /etc/init.d/myservice
chmod +x /etc/init.d/myservice
nano /etc/init.d/myservice

/etc/init.d/myservice start
/etc/init.d/myservice stop

それは私が私のwikimedia wikiのためにいくつかのpythonのものを実行する方法です:

...
DESC="mediawiki articles converter"
DAEMON='/home/mss/pp/bin/nslave'
DAEMON_ARGS='--cachedir /home/mss/cache/'
NAME='nslave'
PIDFILE='/var/run/nslave.pid'
START_ARGS='--background --make-pidfile --remove-pidfile --chuid mss --chdir /home/mss/pp/bin'

export PATH="/home/mss/pp/bin:$PATH"

do_stop_cmd() {
    start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 \
        $STOP_ARGS \
        ${PIDFILE:+--pidfile ${PIDFILE}} --name $NAME
    RETVAL="$?"
    [ "$RETVAL" = 2 ] && return 2
    rm -f $PIDFILE
    return $RETVAL
}

変数を設定する以外にdo_stop_cmd、Pythonが実行可能ファイルを置き換えるため、オーバーライドする必要があったため、サービスが適切に停止しませんでした。


3

上記のクールなソリューションとは別に、プロセスを開始し、その存在を監視し、死亡した場合にそれを開始できる監視ツールおよび監視ツールについても言及します。「monit」を使用すると、プロセスがhttpリクエストに応答するかどうかのチェックなどのアクティブなチェックを実行することもできます


3

Ubuntuの場合、これを使用します。

(PROG_SH&> / dev / null&を実行)

よろしく


マイナーポイント:PROG_SHが実行可能ファイルである場合、「exec」は必要ありません。Davidが提案した解決策の要点は、現在実行中のシェルから子の関連付けを解除することです。子の親は「pid 1」になり、シェルが終了しても影響を受けません。
SoloPilot 2018

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