94

+またはサーバーのシャットダウンに応答して、Windows-8でホストされているnode.jsアプリケーションを正常にシャットダウンするために、ここでのガイダンス(イベントのリッスン)に従っています。SIGINTCtrlC

しかし、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に同等のイベントはありますか?

4

8 に答える 8

162

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();
});
于 2013-02-13T19:32:22.080 に答える
27

いつかはわかりませんが、ノード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のコマンドプロンプトでも動作します。

于 2017-07-28T09:20:01.183 に答える
8

現在 は、Windowsを含むすべてのプラットフォームで動作します。

次のコードはログに記録され、Windows10で正しく終了します。

process.on('SIGINT', () => {
    console.log("Terminating...");
    process.exit(0);
});
于 2018-01-19T09:13:59.987 に答える
7

他のタスクで「readline」をインポートする必要がない限り、プログラムがWindowsで実行されていることを確認したら、「readline」をインポートすることをお勧めします。さらに、知らない人のために-これはWindows32ビットシステムとWindows64ビットシステムの両方で機能します(キーワード「win32」を返します)。このソリューションをありがとうガブリエル。

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();
});
于 2013-09-07T20:44:25.220 に答える
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();
  }
});
于 2012-04-05T05:56:41.967 に答える
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");
        }
    });
}
于 2013-01-01T21:47:49.737 に答える
0

上記のことは何もうまくいきませんでした。そのため、回避策は、readlineをぶら下げて、そこからの信号をキャッチすることでした。

ここに私の解決策:

const readline = require('readline');

const rl = readline.createInterface({ input: process.stdin, output: process.stdout });

// Flag to be able to force the shutdown
let isShuttingDown = false;

// https://nodejs.org/api/readline.html
rl.on('SIGINT', async () => {
  if (isShuttingDown) {
    logger.info("Forcing shutdown, bye.");
    process.exit();
  } else {
    if (!<yourIsCleanupNecessaryCheck>()) {
      logger.info("No cleanup necessary, bye.");
      process.exit();
    } else {
      logger.info("Closing all opened pages in three seconds (press Ctrl+C again to quit immediately and keep the pages opened) ...");
      isShuttingDown = true;
      await sleep(3000);
      await <yourCleanupLogic>();
      logger.info("All pages closed, bye.");
      process.exit();
    }
  }

function sleep(ms: number) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

それは非常にバニラであり、非同期であり、MacOS11.3とWindows10の両方で動作します(執筆時点)。

于 2021-05-17T09:46:09.777 に答える
0

Windows + Git Bash / Cygwinソリューション:

WindowsとGitBashの他のソリューションはどれも機能しなかったので、私のソリューションは、次のようにWINPTYを使用してNodeを起動することでした。

package.jsonはこの開始スクリプトを持っています:

"start": "winpty node app.js"

これは、同様のPythonの問題についてここで受け入れられた回答に触発されました。

pythonエラーwin32へのシグナル18の抑制

注: WINPTYはWindowsXP以降で動作します。

于 2021-09-30T17:38:43.947 に答える