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"
}
즉, 이것이 저라면 pm2
git 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.title
nodejs 문서 ( 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()
.