Program Tip

node.js의 process.on ( 'SIGINT')에 해당하는 Windows는 무엇입니까?

programtip 2020. 10. 23. 08:20
반응형

node.js의 process.on ( 'SIGINT')에 해당하는 Windows는 무엇입니까?


여기 지침 (SIGINT 이벤트 수신)에 따라 Ctrl-C 또는 서버 종료에 대한 응답으로 Windows-8 호스팅 node.js 애플리케이션을 정상적으로 종료합니다.

그러나 Windows에는 SIGINT. 나도 시도 process.on('exit')했지만 생산적인 일을하기에는 늦은 것 같습니다.

Windows에서이 코드는 다음을 제공합니다. 오류 : 해당 모듈 없음

process.on( 'SIGINT', function() {
  console.log( "\ngracefully shutting down from  SIGINT (Crtl-C)" )
  // wish this worked on Windows
  process.exit( )
})

Windows에서이 코드는 실행되지만 정상적으로 수행하기에는 너무 늦습니다 .

process.on( 'exit', function() {
  console.log( "never see this log message" )
})

거기에 SIGINTWindows에서 해당 이벤트는?


readline 모듈을 사용하고 SIGINT 이벤트를 수신해야합니다.

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

언제인지 확실하지 않지만 노드 8.x 및 Windows 10에서 원래 질문 코드는 이제 간단히 작동합니다.

여기에 이미지 설명 입력

Windows 명령 프롬프트에서도 작동합니다.


다른 작업에 대해 "readline"가져 오기가 필요하지 않은 경우 프로그램이 Windows에서 실행되고 있음을 확인한 후 "readline"을 가져 오는 것이 좋습니다. 또한 인식하지 못하는 사용자를 위해 Windows 32 비트 및 Windows 64 비트 시스템 모두에서 작동합니다 (키워드 "win32"를 반환 함). 이 솔루션 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();
});

현재 Windows 콘솔 제어 이벤트를 캡처하기위한 노드는 아직 지원되지 않으므로 POSIX 신호에 해당하는 항목이 없습니다.

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

그러나 tty 모듈 문서 는 정상 종료를 시작하기 위해 키 누름을 캡처하는 메커니즘의 예를 제공하지만 이는 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();
  }
});

요즘에는 Windows를 포함한 모든 플랫폼 에서 작동 합니다 .

다음 코드는 Windows 10에서 기록한 후 제대로 종료됩니다.

process.on('SIGINT', () => {
    console.log("Terminating...");
    process.exit(0);
});

node.js 0.8 이후 keypress이벤트는 더 이상 존재하지 않습니다. 그러나 이벤트를 다시 구현하는 keypress 라는 npm 패키지가 있습니다 .

로 설치 한 npm install keypress후 다음과 같이하십시오.

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

참고 URL : https://stackoverflow.com/questions/10021373/what-is-the-windows-equivalent-of-process-onsigint-in-node-js

반응형