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


304

ポートをリッスンする単純なTCPサーバーがあります。

var net = require("net");

var server = net.createServer(function(socket) {
    socket.end("Hello!\n");
});

server.listen(7777);

node server.jsMacで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)

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


2
おそらくCtrl-Z * NIXでコマンドを中断し、それを閉じないことを追加する価値があります。あなたが入力した場合fgはCtrl-Zの後にあなたが中断した場所、あなたが戻ってきます。したがって、以前のノードはまだ実行中です。他のコマンドでもこれを行う場合は注意してください!
ruffin '11 / 11/16

1
@ruffinこれは答えになるはずです。あなたがやった場合Ctrl+Zのアクションを、適切な方法が考えられfg、プロセスを復活させ、その後、Ctrl+C適切にそれを殺すために。
メタグラファー

回答:


393

プログラムを終了するには、Ctrl+ を使用する必要がありますC。これを行うと、が送信されSIGINT、プログラムが正常に終了し、リッスンしているポートからバインドが解除されます。

参照:https : //superuser.com/a/262948/48624


21
Ctrl + C私にはうまくいきません。^Cコンソールに入力するだけで、プログラムは終了しません。
Eleeist

1
@Eleeist、あなたは端末として何を使っていますか?それは私にとって素晴らしい働きをします。
ブラッド

2
@Eleeist、あなたはおそらくあなたの鍵か何かを再マッピングしたでしょう。 Ctrl+C正常に動作します。いずれにせよ、それはあなたの本当の問題とは別の問題です。SuperUser.comに「Ctrl + Cが機能しない」という質問を投稿してください。
ブラッド

1
@ jt0ddいつでもできますがkill -9、できません。実際にアプリケーションがポートを開いたままにしていることを本当に確信していますか?私はその問題を持ったことがありません。アプリケーションが終了するとすぐに、接続は常に即座に終了します。私はnetstatを使用して、アプリやその他のものがそのポートに残っているかどうかを判断します。
Brad

1
他の言語でキーボードタイプを使用していたときに、この問題に直面しました。Macの入力言語が英語であることを確認してください
Fa.Shapouri

325

Ctrl+ Z一時停止します。つまり、実行を継続できます。

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

次のように手動で強制終了することもできます。

ps aux | grep node

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

kill -9 PROCESS_ID

これもうまくいくかもしれません

killall node

ctrl + cは機能しますが、これらのコマンドはどれも機能しません。なぜだかわかりませんか?そして、コマンドラインソリューションを探しています
怒っているキウイ

7
killallノードに注意してください。「ノード」と一致する場合、強制終了したくないプロセスを強制終了する可能性があります
Samuel Bolduc

1
killall nodeそれが本当に最も簡単で信頼性の高いオプションなので、答えを上に移動することをお勧めします(すべてのインスタンスを
削除しても問題がない限り

4
「killall」は、内部または外部コマンド、操作可能なプログラム、またはバッチファイルとして認識されません。私は何かを逃していますか?
Ayyash

ここも同じです...答えはありませんか?'killall'が認識されていません。他のコマンドも機能しません。コンピューターを再起動する必要がありますか?
方法論医、2017

37

または、これらすべてを1行で行うこともできます。

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

'\ snode \ s'内のノードを他のプロセス名に置き換えることができます。


2
あるいは、いつでも試すことができます。grep "ノード" | awk '{print $ 2}' | xargs kill -9
frymaster 2015

動作しているようですが、プロンプトに適切に戻りません。考え?
デビルズアドボケイト

25

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

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。私も同じ問題を抱えていて、彼のコメントは私自身で解決するのに役立ちました。


22

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


2
それはあなたがまずREPLにいることを前提としています。Nodeスクリプトを実行している場合はどうなりますか?
IgorGanapolsky 2017年

18

Node.jsをインタラクティブに実行している場合(REPL):

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

process.exit()

または単にCtrl+を使用しますD



13

Linuxの場合: pkill node

Windowsの場合:

Taskkill /IM node.exe /F

または

from subprocess import call

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

5

これは遅い答えですが、NodeJS docsからこれを見つけました:

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

要約すると、次のように終了できます。

  1. .exitnodejs REPLで入力します。
  2. <ctrl>-C2回押す。
  3. を押し<ctrl>-Dます。
  4. process.exit(0)REPLからの自然な出口を意味します。他のステータスを返したい場合は、ゼロ以外の数値を返すことができます。
  5. process.kill(process.pid) コード内またはREPLからnodejs apiを使用して強制終了する方法です。

5

プロダクションデプロイメントを使用する多くのプロジェクトでは、これらのプロセスを停止する必要があるスクリプトを用意しているため、この回答を追加します。

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

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


3

サーバーをnpm stopこのようなもので停止したい場合。サーバープロセスを強制終了するコードは次のように記述できます。

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

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


2

複数のノードサーバーを実行している問題に遭遇しました。それらの1つを強制終了し、スクリプトから再展開したいのです。

注:この例はMacのbashシェルにあります。

そのためにはnode、できるだけ具体的に電話をかけるようにします。たとえばnode server.js、appsディレクトリから呼び出すのではなく、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

遅い答えですが、Windowsでは、CTRL + ALT + DELでタスクマネージャーを開き、Node.jsプロセスを強制終了すると、このエラーが解決します。


2

次のコマンドを実行して、localserver kill(ここでは8000)で特定することができます

http:// localhost:8000 / kill PID(processId):

$:lsof -i tcp:8000

次のTCPグループが提供されます。

コマンドPIDユーザーFDタイプデバイスサイズ/オフノード名

ノード21521 ubuntu 12u IPv6 345668 0t0 TCP *:8000(リッスン)

$:kill -9 21521

TCP *:8000に対応するプロセスIDを強制終了します



2

フューザーを使用して、やりたいことを行うことができます。

ポートで実行されているタスクのプロセスIDを取得するには、次のようにします。

fuser <<target_port>>/tcp

ポートが8888であるとしましょう。コマンドは次のようになります。

fuser 8888/tcp

そして、するために殺すのポート上で動作しているプロセスを、単純に-kスイッチを追加します。

fuser <<target_port>>/tcp -k

例(ポートは8888):

fuser 8888/tcp -k

それでおしまい!ポートをリッスンしているプロセスを閉じます。通常、これはサーバーアプリケーションを実行する前に行います。


1

私の使用例:MacOSでは、スクリプトから異なるポートで複数のノードサーバーを実行/再実行します

実行"cd $PATH1 && node server1.js & cd $PATH2 && node server2.js & ..."

stop1"kill -9 $(lsof -nP -i4TCP:$PORT1 | grep LISTEN | awk '{print $2}')"

ストップ2、ストップ3 ...

再実行"stop1 & stop2 & ... & stopN ; run

ポートでプロセスを見つける方法の詳細についてMac OS Xの特定のTCPポートでリッスンしているのは誰ですか?


0

Windowsの場合、最初にポート番号でPIDを検索します

netstat -ano | findStr "portNumber"

その後、タスクを強制終了し、「c」ドライブのルートにいることを確認します。ここに画像の説明を入力してください コマンドは次のようになります。taskkill /F /PID your pid


0

VS Codeとターミナル選択ノードを使用している場合は、最初に右側のドロップダウンからノードを選択し、次にCtrl + Cを実行します。

ここに画像の説明を入力してください

プロンプトが表示されたら、yを押します。

ここに画像の説明を入力してください

ありがとう

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