web-dev-qa-db-ja.com

Node.jsをバックグラウンドプロセスとして実行し、決して死なないようにするにはどうすればよいですか?

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

$ node server.js &

ただし、2.5時間後に端末は非アクティブになり、プロセスは停止します。端末が接続されていなくてもプロセスを有効に保つことができる方法はありますか。


編集1

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

パテでやるべきことはありますか?


編集2(2012年2月)

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

467
murvinlai

簡単な解決策 (あなたがプロセスに戻ってくることに興味がないのなら、単に実行し続けたいだけです):

Nohup node server.js &

強力な解決策 (対話式の場合はプロセスに再接続できます):

screen

Ctrl + a + dを押してデタッチし、screen -rを実行してアタッチし直します。

Screenに代わる、新しいtmuxも考えてください。

506
MK.

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

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

あなたは本当にscreenを使うべきです。 Nohup long_running &を実行するよりも少し複雑ですが、二度と戻ってこないようになればscreenを理解できます。

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

user@Host:~$ screen

必要なものをすべて実行します。

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

Ctrl + Aを押してからdを押します。完了しました。あなたのセッションはバックグラウンドで進行し続けます。

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

137
Alex Povar

これは古い質問ですが、グーグルでは上位にランクされています。もっとも投票数の多い回答を信じられないのは、スクリーンセッション内で&を使って、あるいはNohupフラグを付けてもnode.jsプロセスを実行することだけが回避策だからです。

特にscreen/tmuxソリューション。これは実際には amateur ソリューションと見なすべきです。 ScreenとTmuxはプロセスを実行し続けるのではなく、端末セッションを多重化するためのものです。サーバー上でスクリプトを実行していて、切断したいときは、それで問題ありません。しかし、node.jsサーバーの場合は、自分のプロセスをターミナルセッションにアタッチしたくありません。これは脆すぎます。 物事を実行し続けるためには、プロセスをデーモン化する必要があります。

それを実行するための優れたツールはたくさんあります。

PM2 http://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]

platformubuntu|centos|redhat|gentoo|systemd|darwin|Amazonになります。

forever.js https://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オプションを付けてDockerコンテナーでサーバーを実行するだけで、voilá、デーモン化された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

誰かがこのページに着地するのを助けてくれることを願っています。仕事に適した道具を常に使用してください。それはあなたに多くの頭痛と時間をかけてあなたを救うでしょう!

117

別の解決策は仕事を辞任する

$ Nohup node server.js &
[1] 1711
$ disown -h %1
24
myururdurmaz

Nohupは、端末が死んだ後でもプログラムを続行することを可能にします。私は実際にはNohupがSSHセッションを正しく終了させるのを妨げる状況を経験したので、あなたも入力をリダイレクトするべきです:

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

Nohupの設定によっては、標準出力と標準エラーをファイルにリダイレクトする必要があるかもしれません。

14

@ Yoichiの答えに基づいて、私は自分のシェルのrcファイルにこの関数を持っています。

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
thiagowfx

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

npm install pm2 -g

node.jsアプリをデーモンとして実行するには、次の手順を実行します。

pm2 start app.js

オプションで Keymetrics.io Unitech製のモニタリングSAASにリンクできます。

7
Donald Derek
$ disown node server.js &

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

6
Skynet

Nohup コマンドについて読みましたか?

5
S.Lott

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

(exec PROG_SH&>/dev/null&)

よろしく

3
David Lopes

Sysv initを使用してdebian上でシステムサービスとしてcommandを実行するには

スケルトンスクリプトをコピーして自分のニーズに合わせて調整します。おそらく、変数を設定するだけでよいのです。何かがあなたのニーズに合わない場合、あなたのスクリプトは/lib/init/init-d-scriptから細かいデフォルトを継承します - あなたのスクリプトでそれをオーバーライドしてください。問題が発生した場合は、ソース/lib/init/init-d-scriptで詳細を確認できます。必須の変数は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

それが私のウィキメディア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
}

Varsを設定する以外に、pythonが実行可能ファイルを置き換えるのでdo_stop_cmdをオーバーライドしなければならなかったので、サービスは正しく停止しませんでした。

3
user3132194

上記のクールな解決策とは別に、プロセスを開始し、その存在を監視し、それが死んだ場合に開始することを可能にする監視ツールと監視ツールについても言及します。 'monit'を使用すると、プロセスがhttpリクエストに対して応答するかどうかのチェックなど、いくつかのアクティブなチェックを実行することもできます。

3

簡単な解決策としてこれを試してください

cmd &exit

0
Hunter Frazier