What is the Windows equivalent of process.on('SIGINT') in node.js?

前端 未结 6 1305
北海茫月
北海茫月 2020-11-28 02:47

I\'m following the guidance here (listening for SIGINT events) to gracefully shutdown my Windows-8-hosted node.js application in response to Ctrl+

相关标签:
6条回答
  • 2020-11-28 03:35

    I'm not sure as of when, but on node 8.x and on Windows 10 the original question code simply works now.

    process.on( "SIGINT", function() {
      console.log( "\ngracefully shutting down from SIGINT (Crtl-C)" );
      process.exit();
    } );
    
    process.on( "exit", function() {
      console.log( "never see this log message" );
    } );
    
    setInterval( () => console.log( "tick" ), 2500 );
    

    also works with a windows command prompt.

    0 讨论(0)
  • 2020-11-28 03:35

    Since node.js 0.8 the keypress event no longer exists. There is however an npm package called keypress that reimplements the event.

    Install with npm install keypress, then do something like:

    // Windows doesn't use POSIX signals
    if (process.platform === "win32") {
        const keypress = require("keypress");
        keypress(process.stdin);
        process.stdin.resume();
        process.stdin.setRawMode(true);
        process.stdin.setEncoding("utf8");
        process.stdin.on("keypress", function(char, key) {
            if (key && key.ctrl && key.name == "c") {
                // Behave like a SIGUSR2
                process.emit("SIGUSR2");
            } else if (key && key.ctrl && key.name == "r") {
                // Behave like a SIGHUP
                process.emit("SIGHUP");
            }
        });
    }
    
    0 讨论(0)
  • 2020-11-28 03:36

    Currently there is still no support in node for capturing the windows console control events, so there are no equivalents to the POSIX signals:

    https://github.com/joyent/node/issues/1553

    However the tty module documentation does give an example of a mechanism to capture the key presses in order to initiate a graceful shutdown, but then this does only work for ctrl+c.

    var tty = require('tty');
    
    process.stdin.resume();
    tty.setRawMode(true);
    
    process.stdin.on('keypress', function(char, key) {
      if (key && key.ctrl && key.name == 'c') {
        console.log('graceful exit of process %d', process.pid);
        process.exit();
      }
    });
    
    0 讨论(0)
  • 2020-11-28 03:46

    Nowadays it just works on all platforms, including Windows.

    The following code logs and then terminates properly on Windows 10:

    process.on('SIGINT', () => {
        console.log("Terminating...");
        process.exit(0);
    });
    
    0 讨论(0)
  • 2020-11-28 03:48

    Unless you need the "readline" import for other tasks, I would suggest importing "readline" once the program has verified that it's running on Windows. Additionally, for those who might be unaware - this works on both Windows 32-bit and Windows 64-bit systems (which will return the keyword "win32"). Thanks for this solution Gabriel.

    if (process.platform === "win32") {
      require("readline")
        .createInterface({
          input: process.stdin,
          output: process.stdout
        })
        .on("SIGINT", function () {
          process.emit("SIGINT");
        });
    }
    
    process.on("SIGINT", function () {
      // graceful shutdown
      process.exit();
    });
    
    0 讨论(0)
  • 2020-11-28 03:50

    You have to use the readline module and listen for a SIGINT event:

    http://nodejs.org/api/readline.html#readline_event_sigint

    if (process.platform === "win32") {
      var rl = require("readline").createInterface({
        input: process.stdin,
        output: process.stdout
      });
    
      rl.on("SIGINT", function () {
        process.emit("SIGINT");
      });
    }
    
    process.on("SIGINT", function () {
      //graceful shutdown
      process.exit();
    });
    
    0 讨论(0)
提交回复
热议问题