node.js가 'npm start'를 표현하는 앱을 중지하는 방법


100

Express v4.x로 node.js 앱을 빌드 한 다음 npm start로 앱을 시작 합니다. 내 질문은 앱을 중지하는 방법입니다. 거기에 NPM 정지 ?

npm 중지를 구현할 때 오류를 포함하도록 편집

/home/nodetest2# npm stop

> nodetest2@0.0.1 stop /home/nodetest2
> pkill -s SIGINT nodetest2

pkill: invalid argument for option 's' -- SIGINT

npm ERR! nodetest2@0.0.1 stop: `pkill -s SIGINT nodetest2`
npm ERR! Exit status 2

답변:


66

예, npm은 중지 스크립트도 제공합니다.

npm help npm-scripts

prestop, stop, poststop : npm stop 명령으로 실행합니다.

package.json에서 위 중 하나를 설정 한 다음 npm stop

npm help npm-stop

에서 설정하면 정말 간단하게 만들 수 있습니다 app.js.

process.title = myApp;

그런 다음 scripts.json에서

"scripts": {
    "start": "app.js"
    , "stop": "pkill --signal SIGINT myApp"
}

즉, 이것이 저라면 pm2git push를 기반으로 자동으로 처리되는 것을 사용하고 있습니다 .


여전히 오류가 있습니다. 분명히 나는 ​​라인 명령에 정통합니다.
ngungo

오히려 @ngungo --signal. man pkillpkill에 대해 읽을 때 사용 합니다.
Evan Carroll

3
@EvanCarroll 앱의 여러 인스턴스가 실행중인 경우 어떻게됩니까?
Amit Kumar Gupta

1
각도 4 앱에서 이것을 구현하는 방법에 대한 아이디어. 구체적으로 어디에서 프로세스 제목을 설정합니까?
kiranghule27

40

여기에있는 다른 모든 솔루션은 OS에 따라 다릅니다. 모든 OS에 대한 독립 솔루션은 다음과 같이 socket.io를 사용합니다.

package.json 두 개의 스크립트가 있습니다.

"scripts": {
  "start": "node server.js",
  "stop": "node server.stop.js"
}

server.js-당신의 평범한 표현이 여기에 있습니다.

const express = require('express');
const app = express();
const server = http.createServer(app);
server.listen(80, () => {
  console.log('HTTP server listening on port 80');
});

// Now for the socket.io stuff - NOTE THIS IS A RESTFUL HTTP SERVER
// We are only using socket.io here to respond to the npmStop signal
// To support IPC (Inter Process Communication) AKA RPC (Remote P.C.)

const io = require('socket.io')(server);
io.on('connection', (socketServer) => {
  socketServer.on('npmStop', () => {
    process.exit(0);
  });
});

server.stop.js

const io = require('socket.io-client');
const socketClient = io.connect('http://localhost'); // Specify port if your express server is not using default port 80

socketClient.on('connect', () => {
  socketClient.emit('npmStop');
  setTimeout(() => {
    process.exit(0);
  }, 1000);
});

그것을 테스트

npm start (평소처럼 서버를 시작하려면)

npm stop (이제 실행중인 서버가 중지됩니다)

위의 코드는 테스트되지 않았지만 (내 코드의 축소 된 버전이며, 내 코드는 작동합니다) 그대로 작동합니다. 어느 쪽이든 socket.io를 사용하여 서버를 중지하려는 경우 취할 일반적인 방향을 제공합니다.


2
이 접근 방식의 장점은 기본적으로 컨테이너를 포함한 모든 환경에서 실행할 수 있다는 것입니다. 일반적으로 프로세스를 조작하는 방법에 상당히 제한적입니다. 제 개인적인 관점에서 보면 가장 우아한 접근 방식입니다.
Der Zinger

16

제안 된 솔루션을 시도했을 때 앱 이름이 잘 렸음을 깨달았습니다. 나는 process.titlenodejs 문서 ( https://nodejs.org/docs/latest/api/process.html#process_process_title ) 에서 읽었습니다.

Linux 및 OS X에서는 argv 메모리를 덮어 쓰기 때문에 이진 이름의 크기와 명령 줄 인수의 길이로 제한됩니다.

내 앱은 인수를 사용하지 않으므로이 코드 줄을 내 app.js

process.title = process.argv[2];

다음 몇 줄을 내 package.json파일에 추가 하십시오.

  "scripts": {
    "start": "node app.js this-name-can-be-as-long-as-it-needs-to-be",
    "stop": "killall -SIGINT this-name-can-be-as-long-as-it-needs-to-be"
  },

정말 긴 프로세스 이름을 사용합니다. npm start그리고 npm stop물론 작품은 npm stop항상 실행중인 모든 프로세스를 종료합니다,하지만 나를 위해 OK입니다.


12

이것은 mintty 버전 문제입니다. 대신 cmd를 사용하십시오. 서버 프로세스를 종료하려면 다음 명령을 실행하십시오.

    taskkill -F -IM node.exe

2
여러 노드 앱이 실행중인 경우 문제가 발생할 수 있으므로 main node.exe를 종료하는 것은 좋지 않습니다.
user889030

11

MAC OS X (/ BSD) : lsof (list open files) 명령을 사용해 볼 수 있습니다.

$ sudo lsof -nPi -sTCP:LISTEN

여기에 이미지 설명 입력

그래서

$ kill -9 3320

9

netstat -nptl 모든 프로세스를 확인하십시오.

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      1736/mongod     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1594/sshd       
tcp6       0      0 :::3977                 :::*                    LISTEN      6231/nodejs     
tcp6       0      0 :::22                   :::*                    LISTEN      1594/sshd       
tcp6       0      0 :::3200                 :::*                    LISTEN      5535/nodejs 

그리고 그것은 단순히 PID 참조에 의해 프로세스를 종료합니다 .... 제 경우에는 6231 / nodejs를 중지하고 싶으므로 다음 명령을 실행합니다.

kill -9 6231

1
OP가 콘솔이 아닌 NPM 스크립트 옵션을 찾고 있다고 생각합니다.
Anderson

4

다음은 이전 답변의 아이디어를 혼합하는 또 다른 솔루션입니다. 플랫폼 독립성에 대한 우려를 해결하면서 "킬 프로세스"접근 방식이 필요합니다.

그것은 tree-kill 패키지 에 의존 하여 서버 프로세스 트리를 죽이는 것을 처리합니다. 일부 도구 (예 babel-node:)가 자식 프로세스를 생성 하기 때문에 프로젝트에서 필요한 전체 프로세스 트리를 죽이는 것을 발견했습니다 . 단일 프로세스 만 종료해야하는 경우 tree-kill을 기본 제공 process.kill()방법으로 대체 할 수 있습니다 .

솔루션은 다음과 같습니다 (처음 두 인수 spawn()는 서버 실행을위한 특정 레시피를 반영하도록 수정해야 함).

빌드 / 시작 -server.js

import { spawn } from 'child_process'
import fs from 'fs'

const child = spawn('node', [
  'dist/server.js'
], {
  detached: true,
  stdio: 'ignore'
})
child.unref()

if (typeof child.pid !== 'undefined') {
  fs.writeFileSync('.server.pid', child.pid, {
    encoding: 'utf8'
  })
}

build / stop-server.js

import fs from 'fs'
import kill from 'tree-kill'

const serverPid = fs.readFileSync('.server.pid', {
  encoding: 'utf8'
})
fs.unlinkSync('.server.pid')

kill(serverPid)

package.json

"scripts": {
  "start": "babel-node build/start-server.js",
  "stop": "babel-node build/stop-server.js"
}

이 솔루션은 서버에서 시작 스크립트를 분리합니다 (즉 npm start, 서버가 중지 될 때까지 차단되지 않고 즉시 반환 됨). 기존의 차단 동작을 선호하는 경우에 대한 options.detached인수 spawn()와에 대한 호출을 제거하기 만하면 됩니다 child.unref().


3

이미 시도했지만 ctrl + c여전히 작동하지 않으면 시도해 볼 수 있습니다. 이것은 나를 위해 일했습니다.

  1. 관리자 권한으로 명령 줄을 실행합니다. 그런 다음 아래 명령을 실행하여 종료 할 프로세스 ID (PID)를 찾으십시오. 포트 번호를 입력하십시오<yourPortNumber>

    netstat -ano | findstr :<yourPortNumber>

여기에 이미지 설명 입력

  1. 그런 다음 PID를 식별 한 후이 명령을 실행합니다.

    taskkill /PID <typeYourPIDhere> /F

여기에 이미지 설명 입력

http://www.callstack.in/tech/blog/windows-kill-process-by-port-number-157 에서 @mit $ ingh에 대한 찬사


2

매우 간단하다면 프로세스를 종료하십시오 ..

localmacpro$ ps
  PID TTY           TIME CMD
 5014 ttys000    0:00.05 -bash
 6906 ttys000    0:00.29 npm   
 6907 ttys000    0:06.39 node /Users/roger_macpro/my-project/node_modules/.bin/webpack-dev-server --inline --progress --config build/webpack.dev.conf.js
 6706 ttys001    0:00.05 -bash
 7157 ttys002    0:00.29 -bash

localmacpro$ kill -9 6907 6906

1

Windows 컴퓨터 (Windows 10에 있음)의 경우 CTRL + C (취소 / 중단) 명령이 cli에서 작동하지 않고 화면이 다음과 같이 표시됩니다.

여기에 이미지 설명 입력

먼저 Enter 키를 누른 다음 (또는 아무 키나 입력 할 수 있음) CTRL + C를 누르면 현재 프로세스에서 일괄 작업을 종료할지 묻는 메시지가 표시됩니다.

여기에 이미지 설명 입력

아마도 CTRL + C는 npm start가 다른 하위 프로세스와 함께 실행되는 동안 상위 프로세스 만 종료합니다. CTRL + C 이전에 추가 키를 눌러야하는 이유는 확실하지 않지만 명령 줄을 닫고 다시 시작하는 것보다 더 잘 작동합니다.

확인해야 할 관련 문제 : https://github.com/mysticatea/npm-run-all/issues/74




0

json 파일에 앱을 중지하는 스크립트가없는 경우 내가 사용하는 옵션은 cmd에서 ctrl + C를 누르는 것입니다.


-1

모든 (3) 솔로 션은 다음과 같습니다.

1-ctlr + C

2- json 파일에서 중지하는 스크립트를 작성했습니다.

"scripts": { "stop": "killall -SIGINT this-name-can-be-as-long-as-it-needs-to-be"},

* 명령 쓰기보다 // npm stop //

3- PC 다시 시작


7
PC를 다시 시작하십시오. 정말?!? 왜 주 회로 차단기를 뒤집지 않습니까? : D
stk

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.