নোড.জেজে প্রসেস.অন ('সিগিন্ট') এর সমতুল্য উইন্ডোজ কী?


85

আমি + বা সার্ভার শাটডাউন এর প্রতিক্রিয়াতে আমার উইন্ডোজ-8-হোস্টেড নোড.জেএস অ্যাপ্লিকেশনটি নিখুঁতভাবে বন্ধ করার জন্য এখানে গাইড ( SIGINTইভেন্টগুলি শুনছি ) অনুসরণ করছি ।CtrlC

তবে উইন্ডোজ নেই SIGINT। আমি চেষ্টাও করেছি process.on('exit'), তবে ফলদায়ক কিছু করতে দেরি হয়ে গেছে বলে মনে হচ্ছে।

উইন্ডোজে, এই কোডটি আমাকে দেয়: ত্রুটি: এ জাতীয় কোনও মডিউল নেই

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

উইন্ডোজে, এই কোডটি চলতে থাকে তবে মনোমুগ্ধকর কিছু করতে দেরি হয় :

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

SIGINTউইন্ডোজ কোন সমতুল্য ইভেন্ট আছে ?


এই সমস্যাটি আমার কাছে আজ এলোমেলোভাবে ঘটেছিল এবং আমি মনে করি এটি নিজেই পঠন মডিউলটির সাথে কিছু করার আছে। আমি কোনও পরীক্ষা করতে পারিনি তবে যেহেতু আমি এই মডিউলটি যুক্ত করেছি তখন থেকেই আমার সমস্যা হতে শুরু করে।
এসভি 443

উত্তর:


151

আপনাকে রিডলাইন মডিউলটি ব্যবহার করতে হবে এবং একটি সাইন ইন ইভেন্টের জন্য শুনতে হবে:

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

সবচেয়ে চমৎকার আপডেট, ধন্যবাদ! পূর্ববর্তী উত্তর হিসাবে উত্তর হিসাবে সেট করা (কীপ্রেসের জন্য শুনুন) আর কাজ করে না।
পেপ্যাডোগ

45
এটি হাস্যকর। কেন এটি নোড কোর দ্বারা পরিচালিত হয় না?
বালুপটন

4
কারণ আপনি স্টিডিনের কথা শোনার পরে প্রক্রিয়া কখনই শেষ হয় না যতক্ষণ না আপনি স্পষ্টভাবে একটি সিগিন্ট সিগন্যাল প্রেরণ করেন।
গ্যাব্রিয়েল লালামাস

4
অতএব, আপনাকে সন্তানের কাছে পিতামাতার কাছ থেকে একটি এলোমেলো বার্তা প্রেরণ করতে হবে, উদাহরণস্বরূপ: "সাইন ইন"।
গ্যাব্রিয়েল লালামাস

8
দেখে মনে হচ্ছে এটি বেশ কিছুক্ষণ আগে সমাধান হয়েছে: github.com/nodejs/node-v0.x-archive/issues/5054
সাইমনসিমিটি

23

আমি কখনই নিশ্চিত নই, তবে নোড ৮.x এবং উইন্ডোজ 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 );

এখানে চিত্র বর্ণনা লিখুন

উইন্ডোজ কমান্ড প্রম্পট দিয়েও কাজ করে।


আমি ভাল হিসাবে এই লক্ষ্য। উইন্ডোজ 7 এখানে আমার কাছে একটি প্রধান সমস্যা
গ্রেগরি নওকোভস্কি

এই পদ্ধতিটি উইন্ডোজ 7 এ নোড 8.11.1 এর সাথে আমার জন্য কাজ করে - তবে আমি এটি একটি গিট ব্যাশ শেল থেকে চালিয়ে যাচ্ছিলাম। ভেবেছিলাম আমি প্রথমে সহজ উপায়টি চেষ্টা করব এবং এটি কার্যকর হয়েছে।
user944849

7

অন্যান্য কাজের জন্য আপনার যদি "রিডলাইন" আমদানির প্রয়োজন না হয় তবে প্রোগ্রামটি উইন্ডোতে চলছে কিনা তা যাচাই হয়ে গেলে আমি "রিডলাইন" আমদানির পরামর্শ দেব। অতিরিক্ত হিসাবে, যারা অজান্ত হতে পারে তাদের জন্য - এটি উইন্ডোজ 32-বিট এবং উইন্ডোজ 64-বিট উভয় সিস্টেমে কাজ করে (যা "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();
});

5

আজকাল এটি কেবল উইন্ডোজ সহ সমস্ত প্ল্যাটফর্মগুলিতে কাজ করে

নিম্নলিখিত কোড লগ করে এবং তারপরে উইন্ডোজ 10 এ সঠিকভাবে শেষ হয়:

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

4
এটি সাইগউইনের অধীনে আমার পক্ষে কাজ করে না। সর্বশেষ উইন্ডোজ 10 (স্বয়ংক্রিয় আপডেট), নোড সংস্করণ 8.11.4 ব্যবহার করে। "এটি কাজ করে না" এর অর্থ হ'ল 1) প্রক্রিয়াটি শেষ হয়ে যায় তবে 2) বার্তাটি কনসোলে লগ হয় না এবং 3) তৈরি করা এইচটিটিপি সংযোগ বন্ধ হয় না। আমার অবশ্য যোগ করা উচিত যে আমি পাওয়ারশেলের আওতায় এটি চেষ্টা করেছি এবং এটি সেখানে প্রত্যাশা অনুযায়ী কাজ করে। তবে আমি সাইগউইনে স্যুইচ করেছি কারণ পাওয়ারশেলের একটি খারাপ কার্ল কমান্ড রয়েছে। ঘৃণা!
জন দেইঘান

4
কোনও আপাত কারণ ছাড়াই এটি আজ আমার জন্য কাজ করা বন্ধ করে দিয়েছে (কোনও আপডেট নেই) এবং কেন তা এখনও জানি না। গৃহীত উত্তর এটি স্থির করে।
এসভি 443

4

উইন্ডোজ কনসোল নিয়ন্ত্রণ ইভেন্টগুলি ক্যাপচারের জন্য নোডে বর্তমানে কোনও সমর্থন নেই, সুতরাং পসিএক্স সিগন্যালের সমতুল্য নেই:

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

ধন্যবাদ, এই তথ্যটি সন্ধান করা, এটি যতক্ষণ না আমি সিটিআরএল + সি এর জন্য সার্ভারে এটি প্রয়োগ করতে পারি এটি আমার কাছে একটি গ্রহণযোগ্য বিকল্প। +1 (তবে .. এই প্রক্রিয়াতে ইভেন্ট শ্রোতাদের যোগ করে পারফরম্যান্সে প্রভাব ফেলবে কিনা তা কোনও ধারণা?)
কোরি গ্রস

আমি এটি করার চেষ্টা করেছি, তবে যখন আমার সার্ভারটি গেম লুপটি চালাচ্ছে তখন স্টিডিনটি উপলব্ধ বলে মনে হচ্ছে না, আমি উপরেরটি ব্যবহার করার সময় CTRL + C কাজ করে না work
কোরি গ্রস

0

নোড.জেস 0.8 এর পরে keypressইভেন্টটি আর বিদ্যমান নেই। তবে একটা npm প্যাকেজ বলা হয় কীপ্রেস যে ঘটনা reimplements।

এর সাথে ইনস্টল করুন 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.