source

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

lovecheck 2023. 9. 14. 23:19
반응형

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

express v4.x로 node.js 앱을 빌드한 다음 npm까지 앱을 시작합니다.제 질문은 앱을 어떻게 정지시키느냐는 것입니다.npm 정류장이 있습니까?

employment npm stop 시 오류를 포함

/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

프리스톱, 스톱, 포스트스톱:npm stop 명령에 의해 실행됩니다.

위의 내용 중 하나를 패키지에 설정합니다.json, 그다음에 사용npm stop

npm help npm-stop

설정만 하면 정말 간단하게 할 수 있습니다.app.js,

process.jp = myApp;

그리고 대본에. json.

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

그러니까, 이게 나라면 내가 사용했을 겁니다.pm2자동적으로 이 일을 처리한 것 같은 것 말입니다

여기에 나와 있는 다른 솔루션들은 모두 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 을 사용하여 서버를 중지하려면 일반적으로 취해야 할 방향을 제공합니다.

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

$ sudo lsof -nPi -sTCP:LISTEN

enter image description here

이러저러한

$ kill -9 3320

제안한 솔루션을 시도해보니 앱 이름이 잘려 있었습니다.나는 읽었습니다.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실행 중인 모든 프로세스를 항상 종료하지만 저는 괜찮습니다.

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

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

    taskkill -F -IM node.exe

ctrl + c아직도 작동이 안 돼요, 이걸 시도해 보세요이것은 저에게 효과가 있었습니다.

  1. 명령줄을 Administrator(관리자)로 실행합니다. 다음 를 실행하여 런래을여다를다를e여n음런s을래den .죽이고 싶은 아이디(PID).트를합니다.<yourPortNumber>

    netstat -ano | findstr :<yourPortNumber>

enter image description here

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

    taskkill /PID <typeYourPIDhere> /F

enter image description here

http://www.callstack.in/tech/blog/windows-kill-process-by-port-number-157 에서 @mit$ing을 받게 된 것

kill $(lsof -t -i :PORT_TO_KILL)

간체판포트와 함께 간단한 복사 붙여넣기를 통해 ex.5000을 제거할 수 있습니다.

Windows 컴퓨터(윈도우 10에 있음)의 경우 cli에서 CTRL + C (Cancel/Abort) Command가 작동하지 않고 화면이 다음과 같이 표시됩니다.

enter image description here

ENTER를 먼저 누르거나(또는 아무 키나 가능합니다) Ctrl + C를 누르면 배치 작업을 종료할지 묻는 현재 프로세스가 나타납니다.

enter image description here

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

확인하려는 관련 문제: https://github.com/mysticatea/npm-run-all/issues/74

여기에 이전 답변에서 나온 아이디어를 혼합한 또 다른 솔루션이 있습니다.플랫폼 독립성에 대한 우려를 해소하면서 '킬 프로세스' 방식을 취하고 있습니다.

서버 프로세스 트리 죽이기를 처리하기 위해 트리 킬 패키지에 의존합니다.프로젝트에서 전체 프로세스 트리를 삭제하는 것이 필요하다는 것을 알게 되었습니다. 왜냐하면 몇몇 도구들(예:babel-node 프로세스를 하위 프로세스를 생성합니다.kill하면 일면는우을된로할수다만e다수fee-hnu,a만l로se-으로 대체할 수 있습니다.process.kill()방법.

. (의 두 은 은 과 은 과 의 과 은 의 은 과 ).spawn()서버를 실행하기 위한 구체적인 레시피를 반영하여 수정해야 함):

build/start-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)

꾸러미의json

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

에서 를 합니다 에서 은 에서 합니다 를 ).npm start는 즉시 반환되며 서버가 중지될 때까지 차단되지 않습니다.동작을 한다면,을,f를 간단히 제거하면 .options.detached에게 spawn()에게 전화를 .child.unref().

json 파일에 앱 정지 스크립트가 없는 경우, 제가 사용하는 옵션은 cmd에서 ctrl+C만 누르면 됩니다.

아주 간단하다면, 그냥 그 과정을 없애버리세요.

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

pm2를 사용하시면 됩니다.

https://pm2.keymetrics.io/docs/usage/quick-start/

설치 후 터미널을 입력하기만 하면 됩니다.

pm2 start app.js그리고 나서.

pm2 stop 0합니다.

모든 (3) 솔로션은 다음

1 - ctlr + C

2- in json 파일은 정지하는 스크립트를 작성합니다.

"scripts": { "stop": "kill all - SIGINT this-name-can-be-time-to-needs" },

*명령보다 쓰기 // npm 중지 //

3- PC를 다시 시작합니다.

운영 환경의 경우 Forever.js를 사용해야 합니다.

시작 및 중지 노드 프로세스에 매우 유용하기 때문에 실행 중인 앱도 나열할 수 있습니다.

https://github.com/foreverjs/forever

조합 ctrl + z Myosis Ubuntu 를 눌러야 합니다.

언급URL : https://stackoverflow.com/questions/23258421/how-to-stop-app-that-node-js-express-npm-start

반응형