web-dev-qa-db-ja.com

コマンドラインからnode.jsプログラムを停止します

ポートで待機する単純な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)

私はプログラムを間違った方法で閉じますか?これを防ぐにはどうすればよいですか。

275
Eleeist

プログラムを終了するには、使用する必要があります Ctrl + C。これを行うと、SIGINTが送信されます。これにより、プログラムは正常に終了し、待機しているすべてのポートから解放されます。

こちらもご覧ください--- https://superuser.com/a/262948/48624

366
Brad

Ctrl+Z 一時停止します。つまり、実行中であることを意味します。

Ctrl+C 実際にそれを殺します。

このように手動で削除することもできます。

ps aux | grep node

プロセスIDを見つけます(左から2番目)。

kill -9 PROCESS_ID

これはまた働くかもしれません

killall node
304
Jamund Ferguson

または代わりに、あなたは1行でこれらのすべての操作を実行できます。

kill -9 $(ps aux | grep '\snode\s' | awk '{print $2}')

あなたは他のプロセス名に「\ Sノード\ s」の内部のノードを置き換えることができます。

34
Hamid

.exitと入力してノードjs REPLを終了できます。

21
sunny1304

Node.jsを対話的に実行している場合(REPL):

Ctrl + C >プロンプトに戻り、次のように入力します。

process.exit()

または単に使用する Ctrl + D

18
sr77in

プロセスを再開して強制終了します。

Ctrl+Z 中断します。つまり、中断されたバックグラウンドプロセスとして実行されています。

あなたは今、端末のプロンプトにいる可能性があります...

  1. コマンドfgを入力して、プロセスをフォアグラウンドで再開します。

  2. タイプ 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。私は同じ問題を抱えていて、彼のコメントは私がそれを自分で解決するのを助けました。

16
Metagrapher

他の端末の$ Sudo killall node mac で動作しますが、killall nodeは動作しません:

$ killall node
No matching processes belonging to you were found
15
Maxim Yefremov

linuxで試してください:pkill node

windowsの場合

Taskkill /IM node.exe /F

または

from subprocess import call

call(['taskkill', '/IM', 'node.exe', '/F'])
7
Jason

これは遅い答えですが、 NodeJSのドキュメント :から見つけました。

REPLが入力として.exitコマンドを受け取るか、SIGINTを通知するために<ctrl>-Cを2回押すか、入力ストリーム上で「end」を通知するために<ctrl>-Dを押すことによってexitイベントが発生します。リスナーコールバックは引数なしで呼び出されます。

要約すると、終了することができます。

  1. Nodejs REPLに.exitと入力する。
  2. <ctrl>-Cを2回押します。
  3. <ctrl>-Dを押します。
  4. process.exit(0)はREPLからの自然な終了を意味します。他のステータスを返したい場合は、ゼロ以外の数を返すことができます。
  5. 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

これにより、サーバーアプリケーションが正常にシャットダウンされます。

4
Decoded

複数のノードサーバー を実行していて - それらのうちの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を使うことができます。

2
bapin93

答えが遅いですがウィンドウズでは、Ctrl + Alt + Delキーを押してタスクマネージャを開き、Node.jsプロセスを終了するとこのエラーは解決します。

2
Robert Molina

npm stopまたはこれに似たものであなたのサーバーを止めたい場合。サーバープロセスを終了させるコードは、次のように書くことができます。

require('child_process').exec(`kill -9 ${pid}`)

詳細については、このリンクを確認してください。 https://Gist.github.com/dominhhai/aa7f3314ad27e2c50fd5

2
BigEgg

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を強制終了します

0
Ank_247shbm

MacOSの場合

  1. オープンターミナル
  2. 以下のコードを実行してEnterキーを押します

     Sudo kill $(Sudo lsof -t -i:4200)
    
0

私のユースケース: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ポートをリッスンしていますか?

0
Edan Chetrit

Windowsでは、まずポート番号でPIDを検索します

netstat -ano | findStr "portNumber"

その後、タスクを強制終了し、「c」ドライブのルートにいることを確認してください enter image description here そして、コマンドはtaskkill /F /PID your pidになります

0
gem007bd