How to stop app that node.js express 'npm start'

后端 未结 16 2011
名媛妹妹
名媛妹妹 2020-12-07 11:00

You build node.js app with express v4.x then start your app by npm start. My question is how to stop the app? Is there npm stop?

相关标签:
16条回答
  • 2020-12-07 11:08

    In case your json file does not have a script to stop the app, an option that I use is just by pressing ctrl+C on the cmd.

    0 讨论(0)
  • 2020-12-07 11:09

    On MAC OS X(/BSD): you can try to use the lsof (list open files) command

    $ sudo lsof -nPi -sTCP:LISTEN
    

    and so

    $ kill -9 3320
    
    0 讨论(0)
  • 2020-12-07 11:11

    All the other solutions here are OS dependent. An independent solution for any OS uses socket.io as follows.

    package.json has two scripts:

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

    server.js - Your usual express stuff lives here

    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);
    });
    

    Test it out

    npm start (to start your server as usual)

    npm stop (this will now stop your running server)

    The above code has not been tested (it is a cut down version of my code, my code does work) but hopefully it works as is. Either way, it provides the general direction to take if you want to use socket.io to stop your server.

    0 讨论(0)
  • 2020-12-07 11:15

    When I tried the suggested solution I realized that my app name was truncated. I read up on process.title in the nodejs documentation (https://nodejs.org/docs/latest/api/process.html#process_process_title) and it says

    On Linux and OS X, it's limited to the size of the binary name plus the length of the command line arguments because it overwrites the argv memory.

    My app does not use any arguments, so I can add this line of code to my app.js

    process.title = process.argv[2];
    

    and then add these few lines to my package.json file

      "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"
      },
    

    to use really long process names. npm start and npm stop work, of course npm stop will always terminate all running processes, but that is ok for me.

    0 讨论(0)
  • 2020-12-07 11:16

    Here's another solution that mixes ideas from the previous answers. It takes the "kill process" approach while addressing the concern about platform independence.

    It relies on the tree-kill package to handle killing the server process tree. I found killing the entire process tree necessary in my projects because some tools (e.g. babel-node) spawn child processes. If you only need to kill a single process, you can replace tree-kill with the built-in process.kill() method.

    The solution follows (the first two arguments to spawn() should be modified to reflect the specific recipe for running your server):

    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)
    

    package.json

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

    Note that this solution detaches the start script from the server (i.e. npm start will return immediately and not block until the server is stopped). If you prefer the traditional blocking behavior, simply remove the options.detached argument to spawn() and the call to child.unref().

    0 讨论(0)
  • 2020-12-07 11:17

    This is a mintty version problem alternatively use cmd. To kill server process just run this command:

        taskkill -F -IM node.exe
    
    0 讨论(0)
提交回复
热议问题