私はPuTTY SSHを介してLinuxサーバに接続します。私はこのようなバックグラウンドプロセスとしてそれを実行しようとしました:
$ node server.js &
ただし、2.5時間後に端末は非アクティブになり、プロセスは停止します。端末が接続されていなくてもプロセスを有効に保つことができる方法はありますか。
編集1
実際、私はNohup
を試しましたが、PuTTY SSHターミナルを閉じるかインターネットを抜くとすぐに、サーバープロセスはすぐに停止します。
パテでやるべきことはありますか?
編集2(2012年2月)
node.js
モジュール、 forever があります。デーモンサービスとしてnode.jsサーバーを実行します。
簡単な解決策 (あなたがプロセスに戻ってくることに興味がないのなら、単に実行し続けたいだけです):
Nohup node server.js &
強力な解決策 (対話式の場合はプロセスに再接続できます):
screen
Ctrl + a + dを押してデタッチし、screen -r
を実行してアタッチし直します。
Screenに代わる、新しいtmuxも考えてください。
Nohup node server.js > /dev/null 2>&1 &
Nohup
の意味:sttyが切断されても、このプロセスを終了しないでください。> /dev/null
は、stdoutが/ dev/null(出力を記録しないダミーデバイス)に移動することを意味します。2>&1
は次を意味します:stderrは標準出力(既に/dev/null
にリダイレクトされています)にも移動します。 &1をエラーのログを保持するファイルパスに置き換えることができます。例:2>/tmp/myLog
&
の最後の意味:このコマンドをバックグラウンドタスクとして実行します。あなたは本当に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はエントリリストです。
これは古い質問ですが、グーグルでは上位にランクされています。もっとも投票数の多い回答を信じられないのは、スクリーンセッション内で&
を使って、あるいは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]
platform
はubuntu|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
誰かがこのページに着地するのを助けてくれることを願っています。仕事に適した道具を常に使用してください。それはあなたに多くの頭痛と時間をかけてあなたを救うでしょう!
別の解決策は仕事を辞任する
$ Nohup node server.js &
[1] 1711
$ disown -h %1
Nohup
は、端末が死んだ後でもプログラムを続行することを可能にします。私は実際にはNohup
がSSHセッションを正しく終了させるのを妨げる状況を経験したので、あなたも入力をリダイレクトするべきです:
$ Nohup node server.js </dev/null &
Nohup
の設定によっては、標準出力と標準エラーをファイルにリダイレクトする必要があるかもしれません。
@ 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"
Nohupとscreenは、Node.jsをバックグラウンドで実行するための優れた軽量のソリューションを提供します。 Node.jsプロセスマネージャ( PM2 )はデプロイメントに便利なツールです。あなたのシステムにグローバルにnpmでインストールしてください。
npm install pm2 -g
node.jsアプリをデーモンとして実行するには、次の手順を実行します。
pm2 start app.js
オプションで Keymetrics.io Unitech製のモニタリングSAASにリンクできます。
$ disown node server.js &
アクティブなタスクリストからコマンドを削除し、そのコマンドをバックグラウンドに送信します。
Nohup コマンドについて読みましたか?
Ubuntuの場合はこれを使用します。
(exec PROG_SH&>/dev/null&)
よろしく
Sysv initを使用してdebian上でシステムサービスとしてcommandを実行するには
スケルトンスクリプトをコピーして自分のニーズに合わせて調整します。おそらく、変数を設定するだけでよいのです。何かがあなたのニーズに合わない場合、あなたのスクリプトは/lib/init/init-d-script
から細かいデフォルトを継承します - あなたのスクリプトでそれをオーバーライドしてください。問題が発生した場合は、ソース/lib/init/init-d-script
で詳細を確認できます。必須の変数はDAEMON
とNAME
です。スクリプトはあなたのコマンドを実行するのに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
をオーバーライドしなければならなかったので、サービスは正しく停止しませんでした。
上記のクールな解決策とは別に、プロセスを開始し、その存在を監視し、それが死んだ場合に開始することを可能にする監視ツールと監視ツールについても言及します。 'monit'を使用すると、プロセスがhttpリクエストに対して応答するかどうかのチェックなど、いくつかのアクティブなチェックを実行することもできます。
簡単な解決策としてこれを試してください
cmd &exit