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


84

+ 또는 서버 종료 에 대한 응답으로 Windows-8 호스팅 node.js 애플리케이션을 정상적으로 종료하기 위해 여기에 있는 지침 ( SIGINT이벤트 수신 )을 따르고 있습니다.CtrlC

그러나 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 모듈 자체와 관련이 있다고 생각합니다. 나는 어떤 테스트도 할 수 없었지만이 모듈을 추가 한 이후로 문제가 발생하기 시작했습니다.
Sv443

답변:


148

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

가장 훌륭한 업데이트, 감사합니다! 이 답변을 이전 답변 (키 누르기 듣기)으로 설정하면 더 이상 작동하지 않습니다.
pappadog 2013

44
이건 말도 안돼. 왜 이것이 노드 코어에서 처리되지 않습니까?
balupton 2013

3
stdin을 청취 할 때 SIGINT 신호를 명시 적으로 보낼 때까지 프로세스가 완료되지 않기 때문입니다.
Gabriel Llamas

2
따라서 부모에서 자식에게 임의의 메시지를 보내야합니다 (예 : "SIGINT").
Gabriel Llamas

8
다음과 같습니다 해결있어 꽤 전에 : github.com/nodejs/node-v0.x-archive/issues/5054
SimonSimCity

23

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

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

여기에 이미지 설명 입력

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


나는 이것도 알아 차렸다. 윈도우 7은 여기에 나를 위해 큰 문제입니다
그레고리 Nowakowski

이 방법은 Windows 7의 Node 8.11.1에서 작동 하지만 git bash 셸에서 실행했습니다. 먼저 간단한 방법을 시도해 보았고 효과가 있다고 생각했습니다.
user944849 apr

7

다른 작업에 대해 "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();
});

5

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

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

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

2
이것은 cygwin에서 나를 위해 작동하지 않습니다. 최신 Windows 10 (자동 업데이트), 노드 버전 8.11.4를 사용합니다. "작동하지 않는다"는 것은 1) 프로세스가 종료되지만 2) 메시지가 콘솔에 기록되지 않고 3) 생성 된 HTTP 연결이 종료되지 않음을 의미합니다. 그러나 PowerShell에서 시도했으며 예상대로 작동한다고 추가해야합니다. 그러나 PowerShell에는 잘못된 curl 명령이 있기 때문에 cygwin으로 전환했습니다. 꿰매다!
John Deighan

2
그것은 명백한 이유 (아무것도 업데이트 없음)없이 오늘 저에게 작동을 멈췄으며 여전히 이유를 모릅니다. 받아 들여진 대답으로 해결되었습니다.
Sv443

4

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

감사합니다.이 정보를 찾고 있습니다. CTRL + C를 위해 서버에서 구현할 수있는 한이 정보를 대체 할 수 있습니다. +1 (그러나 .. 어떤 생각 공정에 이벤트 리스너를 추가하여이 뜻 효과 성과 여부?)
코리 총

이 작업을 시도했지만 서버에서 게임 루프를 실행할 때 stdin을 사용할 수없는 것 같으며 위를 사용할 때 CTRL + C가 작동하지 않습니다.
Cory Gross

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");
        }
    });
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.