[node.js] node.js가 ‘npm start’를 표현하는 앱을 중지하는 방법

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



답변

예, 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를 기반으로 자동으로 처리되는 것을 사용하고 있습니다 .


답변

여기에있는 다른 모든 솔루션은 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를 사용하여 서버를 중지하려는 경우 취할 일반적인 방향을 제공합니다.


답변

제안 된 솔루션을 시도했을 때 앱 이름이 잘 렸음을 깨달았습니다. 나는 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입니다.


답변

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

    taskkill -F -IM node.exe


답변

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

$ sudo lsof -nPi -sTCP:LISTEN

여기에 이미지 설명 입력

그래서

$ kill -9 3320


답변

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


답변

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

그것은 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().