ポートで待機する単純なTCPサーバーがあります。
var net = require("net");
var server = net.createServer(function(socket) {
socket.end("Hello!\n");
});
server.listen(7777);
私はnode server.js
で始めて、それからMacではCtrl + Zでそれを閉じます。 node server.js
を使用して再度実行しようとすると、次のエラーメッセージが表示されます。
node.js:201
throw e; // process.nextTick error, or 'error' event on first tick
^
Error: listen EADDRINUSE
at errnoException (net.js:670:11)
at Array.0 (net.js:771:26)
at EventEmitter._tickCallback (node.js:192:41)
私はプログラムを間違った方法で閉じますか?これを防ぐにはどうすればよいですか。
プログラムを終了するには、使用する必要があります Ctrl + C。これを行うと、SIGINT
が送信されます。これにより、プログラムは正常に終了し、待機しているすべてのポートから解放されます。
こちらもご覧ください--- https://superuser.com/a/262948/48624
Ctrl+Z 一時停止します。つまり、実行中であることを意味します。
Ctrl+C 実際にそれを殺します。
このように手動で削除することもできます。
ps aux | grep node
プロセスIDを見つけます(左から2番目)。
kill -9 PROCESS_ID
これはまた働くかもしれません
killall node
または代わりに、あなたは1行でこれらのすべての操作を実行できます。
kill -9 $(ps aux | grep '\snode\s' | awk '{print $2}')
あなたは他のプロセス名に「\ Sノード\ s」の内部のノードを置き換えることができます。
.exit
と入力してノードjs REPLを終了できます。
Node.jsを対話的に実行している場合(REPL):
Ctrl + C >プロンプトに戻り、次のように入力します。
process.exit()
または単に使用する Ctrl + D。
Ctrl+Z 中断します。つまり、中断されたバックグラウンドプロセスとして実行されています。
あなたは今、端末のプロンプトにいる可能性があります...
コマンドfg
を入力して、プロセスをフォアグラウンドで再開します。
タイプ Ctrl+C 正しく殺すために。
(注:次のコマンドにはrootが必要なので、Sudo ...
がお友達です)
pkill -9 node
または、pkillを持っていなければ、これでうまくいくかもしれません。
killall node
またはおそらくこれ:
kill $(ps -e | grep node | awk '{print $1}')
時々プロセスはそれ自身のgrepをリストするでしょう、その場合あなたは必要となるでしょう:
kill $(ps -e | grep dmn | awk '{print $2}')
。
質問自体のコメントからのh/t @ruffin。私は同じ問題を抱えていて、彼のコメントは私がそれを自分で解決するのを助けました。
他の端末の$ Sudo killall node
は mac で動作しますが、killall node
は動作しません:
$ killall node
No matching processes belonging to you were found
linuxで試してください:pkill node
windowsの場合
Taskkill /IM node.exe /F
または
from subprocess import call
call(['taskkill', '/IM', 'node.exe', '/F'])
これは遅い答えですが、 NodeJSのドキュメント :から見つけました。
REPLが入力として
.exit
コマンドを受け取るか、SIGINTを通知するために<ctrl>-C
を2回押すか、入力ストリーム上で「end」を通知するために<ctrl>-D
を押すことによってexitイベントが発生します。リスナーコールバックは引数なしで呼び出されます。
要約すると、終了することができます。
.exit
と入力する。<ctrl>-C
を2回押します。<ctrl>-D
を押します。process.exit(0)
はREPLからの自然な終了を意味します。他のステータスを返したい場合は、ゼロ以外の数を返すことができます。process.kill(process.pid)
は、コード内またはREPLからnodejs apiを使用して強制終了する方法です。私はこの答えを付け加えています。プロダクション環境で展開している多くのプロジェクトでは、これらのプロセスを停止するスクリプトがあるので、そうする必要はありません。
Node Serverプロセスを管理するための綺麗な方法は、(forever
から)NPM
パッケージを使用することです。
npm install forever -g
forever start -al ./logs/forever.log -ao ./logs/out.log -ae ./logs/err.log server.js
info: Forever processing file: server.js
forever stop server.js
info: Forever stopped process: uid command script forever pid id logfile uptime [0] sBSj "/usr/bin/nodejs/node" ~/path/to/your/project/server.js 23084 13176 ~/.forever/forever.log 0:0:0:0.247
これにより、サーバーアプリケーションが正常にシャットダウンされます。
複数のノードサーバー を実行していて - それらのうちの1つを強制終了したい そしてスクリプトからそれを再デプロイしたいのです。
注:この例はMacのbashシェルにあります。
そうするために、私は私のnode
呼び出しをできるだけ特定のものにするようにしています。たとえば、appsディレクトリからnode server.js
を呼び出すのではなく、node app_name_1/app/server.js
を呼び出します。
それから私はそれを使ってそれを殺すことができます:
kill -9 $(ps aux | grep 'node\ app_name_1/app/server.js' | awk '{print $2}')
これにより、app_name_1/app/server.jsを実行しているノードプロセスのみが強制終了されます。
node app_name_2/app/server.js
を実行した場合、このノードプロセスは実行を続けます。
あなたがそれらすべてを殺したいのなら、他の人が言ったようにkillall node
を使うことができます。
答えが遅いですがウィンドウズでは、Ctrl + Alt + Delキーを押してタスクマネージャを開き、Node.jsプロセスを終了するとこのエラーは解決します。
npm stop
またはこれに似たものであなたのサーバーを止めたい場合。サーバープロセスを終了させるコードは、次のように書くことができます。
require('child_process').exec(`kill -9 ${pid}`)
詳細については、このリンクを確認してください。 https://Gist.github.com/dominhhai/aa7f3314ad27e2c50fd5
localserver killで特定になるように次のコマンドを実行できます(ここで:8000)
http:// localhost:8000 / kill PID(processId):
$:lsof -i tcp:8000
次のTCPグループを提供します。
コマンドPIDユーザーFDタイプデバイスサイズ/オフノード名
ノード21521 ubuntu 12u IPv6 345668 0t0 TCP *:8000(LISTEN)
$:kill -9 21521
TCP *:8000に対応するprocessIdを強制終了します
MacOSの場合
以下のコードを実行してEnterキーを押します
Sudo kill $(Sudo lsof -t -i:4200)
私のユースケース:on MacOS 、/ rerun 複数のノードサーバー on 異なるポート スクリプトから
run :"cd $PATH1 && node server1.js & cd $PATH2 && node server2.js & ..."
stop1 :"kill -9 $(lsof -nP -i4TCP:$PORT1 | grep LISTEN | awk '{print $2}')"
stop2、stop3 ...
再実行 :"stop1 & stop2 & ... & stopN ; run
ポートでプロセスを見つけることについてのより多くの情報のために: 誰がMac OS X上で与えられたTCPポートをリッスンしていますか?