এক্সিকিউট: স্ট্যান্ডআউট প্রদর্শন "লাইভ"


187

আমার এই সহজ স্ক্রিপ্ট রয়েছে:

var exec = require('child_process').exec;

exec('coffee -cw my_file.coffee', function(error, stdout, stderr) {
    console.log(stdout);
});

যেখানে আমি কেবল একটি কফি স্ক্রিপ্ট ফাইল সংকলন করার জন্য একটি আদেশ কার্যকর করি। তবে stdout কখনই কনসোলে প্রদর্শিত হবে না, কারণ কমান্ডটি কখনই শেষ হয় না (কারণ কফির -w বিকল্পের কারণে)। আমি যদি কনসোল থেকে সরাসরি কমান্ডটি কার্যকর করি তবে আমি এই জাতীয় বার্তা পাই:

18:05:59 - compiled my_file.coffee

আমার প্রশ্ন: নোড.জেএস এক্সিকিউট দিয়ে এই বার্তাগুলি প্রদর্শন করা সম্ভব? হ্যাঁ কিভাবে? !

ধন্যবাদ


1
আমি এখানে পাইথন এক্সিকিউটেবল থেকে স্টাডাউট ক্যাপচার খুঁজছিলাম। নোট করুন যে নীচের সমস্তটিই কাজ করবে, তবে আউটআউট আনবারফার করার জন্য আপনাকে "-u" বিকল্পের সাহায্যে পাইথন চালাতে হবে এবং এর মাধ্যমে সরাসরি আপডেট থাকতে হবে।
অ্যান্ডি

উত্তর:


264

ব্যবহার করবেন না execspawnকোন EventEmmiterবস্তু যা ব্যবহার করুন । তারপরে আপনি stdout/ stderrইভেন্টগুলি ( spawn.stdout.on('data',callback..)) ঘটতে যেমন শুনতে পাচ্ছেন ।

নোডজেএস ডকুমেন্টেশন থেকে:

var spawn = require('child_process').spawn,
    ls    = spawn('ls', ['-lh', '/usr']);

ls.stdout.on('data', function (data) {
  console.log('stdout: ' + data.toString());
});

ls.stderr.on('data', function (data) {
  console.log('stderr: ' + data.toString());
});

ls.on('exit', function (code) {
  console.log('child process exited with code ' + code.toString());
});

exec আউটপুট বাফার করে এবং কমান্ডটি কার্যকর করা শেষ হলে সাধারণত এটি প্রদান করে।


22
খুব সুন্দর. এফওয়াইআই: স্ট্যান্ডআউট / স্টডার ইভেন্টগুলি কলব্যাক আর্গুমেন্ট 'ডেটা' বাফার তাই এটি টু স্ট্রিং () দিয়ে কল করুন
সার্জএল

4
আপনারা যারা উইন্ডোজে কাজ করতে চান না, তাদের দুর্দান্ত উত্তরটি দেখুন
টমেকভি

17
এক্সিকিউট অন্তত সর্বশেষে একটি ইভেন্টইমিটারও।
নিকোলে তেসেনকভ

4
এছাড়াও মনে রাখবেন যে যখনই প্রোগ্রামটি কোনও নতুন লাইনের আউটপুট দেয় কলব্যাক কল হবে না। আপনি যদি শিশু প্রক্রিয়া থেকে "ইভেন্টগুলি" পেতে চান, এই প্রক্রিয়াটি অবশ্যই flush(stdout);নোড.জেএস-এ ইভেন্টগুলি চালানোর জন্য বাফারে ( সিতে) ফ্লাশ করতে হবে ।
জুলিয়ান এফ। ওয়েইনার্ট 20'16

5
+1 এক্সিকিউটিভ ইভেন্ট এমিটার হিসাবেও .. আমার স্ট্রিংটিকে একটি আরোগুলি অ্যারে (খুব দীর্ঘ এবং জটিল ffmpeg কমান্ড লাইন) এর রিফ্যাক্টারে 2 ঘন্টা ব্যয় করেছে .. কেবলমাত্র আমার সত্যিকারের প্রয়োজন নেই তা সন্ধান করার জন্য।
ডেড কথোপকথন

176

exec এমন একটি চাইল্ডপ্রসেস অবজেক্টও ফিরিয়ে দেবে যা ইভেন্ট ইভেন্টটার।

var exec = require('child_process').exec;
var coffeeProcess = exec('coffee -cw my_file.coffee');

coffeeProcess.stdout.on('data', function(data) {
    console.log(data); 
});

বা pipeসন্তানের প্রক্রিয়া স্ট্যান্ডআউট মূল স্টডআউটে।

coffeeProcess.stdout.pipe(process.stdout);

অথবা স্পন ব্যবহার করে স্টিডিও উত্তরাধিকারী

spawn('coffee -cw my_file.coffee', { stdio: 'inherit' });

35
দেখে মনে হচ্ছে স্রেফ ব্যবহার করে এটিকে সহজ করা যায় pipe:coffeeProcess.stdout.pipe(process.stdout);
এরিক ফ্রিজ

3
@ এরিকফ্রিজের মন্তব্য আমি যা খুঁজছিলাম তা হ'ল, কারণ আমি স্টাডাউটের চরিত্র প্রতিস্থাপন বৈশিষ্ট্যটি (নোড স্ক্রিপ্টে
প্রটেক্টরকে জোর দেওয়া

19
সহজ: spawn(cmd, argv, { stdio: 'inherit' })। বিভিন্ন উদাহরণের জন্য nodejs.org/api/child_process.html#child_process_options_stdio দেখুন ।
মরগান টুভেরি কুইলিং

3
@ MorganTouvereyQuilling এর পরামর্শ ব্যবহার করতে জন্য +1 spawnসঙ্গে stdio: 'inherit'। এটি execপাইপিং stdout/ এর চেয়ে আরও সঠিক আউটপুট উত্পাদন করে stderr, উদাহরণস্বরূপ যখন এ থেকে অগ্রগতির তথ্য প্রদর্শিত হয় git clone
লিভভেন

55

ইতিমধ্যে বেশ কয়েকটি উত্তর রয়েছে তবে এর মধ্যে কেউই এটি করার সর্বোত্তম (এবং সবচেয়ে সহজ) উপায়টি উল্লেখ করে নি, যা ব্যবহার করছে spawnএবং { stdio: 'inherit' }বিকল্পটি । এটি সর্বাধিক নির্ভুল আউটপুট উত্পাদন করে বলে মনে হচ্ছে উদাহরণস্বরূপ যখন এ থেকে অগ্রগতির তথ্য প্রদর্শন করা হয় git clone

কেবল এটি করুন:

var spawn = require('child_process').spawn;

spawn('coffee', ['-cw', 'my_file.coffee'], { stdio: 'inherit' });

এই মন্তব্যে এটিকে নির্দেশ করার জন্য @ মরগানটিউভেরি কুইলিংকে ক্রেডিট ।


1
আমি দেখতে পেলাম যে সাব-প্রসেস যখন রঙিন পাঠ্যের মতো ফর্ম্যাটড আউটপুট ব্যবহার করে তখন সেই বিন্যাসটি stdio: "inherit"সংরক্ষণ child.stdout.pipe(process.stdout)করে না।
রিকি গিবসন

এটি এনপিএম ইনস্টলের অগ্রগতি বারের মতো জটিল আউটপুট সহ প্রসেসগুলিতে এমনকি পুরোপুরি আউটপুট সংরক্ষণ করে। অসাধারণ!
ডেভ কো

1
কেন এটি গৃহীত উত্তর নয়? এটি কেবলমাত্র আমার জন্য কাজ করেছিল এবং এটি মাত্র 2 চ * লাইন !!!
লিংকন

এই টিপটি কিছু সিমফনি কমান্ড-লাইন অ্যাপ্লিকেশনগুলি চালিত করার সময় সহায়ক ছিল যা অগ্রগতি বারগুলি ব্যবহার করে। চিয়ার্স।
হাফস্টপ

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত - কেবলমাত্র এমন জিনিস যা নিখুঁত আউটপুট উপস্থাপনা সংরক্ষণ করে এবং এটি সবচেয়ে সহজ? হ্যাঁ দয়া করে
বিস্মৃত

21

আমি কেবল একটি ছোট সমস্যাটি যুক্ত করতে চাই একটি স্পাড প্রক্রিয়া থেকে বাফার স্ট্রিংগুলি আউটপুট দেওয়ার সাথে console.log()এটি নতুন লাইন যুক্ত করে, যা আপনার স্প্যান প্রসেস আউটপুটটিকে অতিরিক্ত লাইনের উপরে ছড়িয়ে দিতে পারে। যদি আপনি আউটপুট stdoutবা পরিবর্তে এর stderrসাথে থাকেন তবে আপনি তৈরি প্রসেসটি 'যেমন রয়েছে' থেকে কনসোল আউটপুট পাবেন।process.stdout.write()console.log()

আমি এখানে সমাধানটি দেখতে পেয়েছি: নোড.জেএস: কোনও পেছনের নিউলাইন ছাড়াই কনসোলে মুদ্রণ করা হচ্ছে?

আশা করি যে উপরের সমাধানটি ব্যবহার করে কাউকে সহায়তা করবে (এটি ডকুমেন্টেশন থেকে থাকলেও লাইভ আউটপুটের জন্য এটি দুর্দান্ত)


1
এমনকি আরো সঠিক আউটপুট ব্যবহারের জন্য spawn(command, args, { stdio: 'inherit' }), যেমন এখানে @MorganTouvereyQuilling দ্বারা প্রস্তাবিত stackoverflow.com/questions/10232192/...
Livven

20

নাথানেল স্মিথের উত্তর এবং এরিক ফ্রিসের মন্তব্য দ্বারা অনুপ্রাণিত, এটি এতটা সহজ হতে পারে:

var exec = require('child_process').exec;
exec('coffee -cw my_file.coffee').stdout.pipe(process.stdout);

এটি সাধারণ কমান্ডগুলির মতো সূক্ষ্মভাবে কাজ করে বলে মনে হয় lsতবে আরও জটিল কমান্ড যেমন ব্যর্থ হয় npm install। এমনকি stdout এবং stderr উভয়ই তাদের নিজ নিজ প্রক্রিয়া অবজেক্টগুলিতে পাইপ করার চেষ্টা করেছি।
লিনাক্সদান

@ লিনাক্সডান এটি হতে পারে কারণ এনপিএম স্টেডারে লিখছে (আমি কিছু লোক সেখানে প্রগতি বার লিখতে দেখেছি)। আপনি stpedr পাইপ করতে পারেন, বা stderr শোনার জন্য টঙ্গফা সমাধান প্রসারিত করতে পারেন।
সের্গিউ

কি আমি সবচেয়ে নির্ভরযোগ্য উপায় দেখা করেছি থেকে @linuxdan হয় spawn(command, args, { stdio: 'inherit' }), যেমন এখানে প্রস্তাব stackoverflow.com/questions/10232192/...
Livven

12

আমি এটি ব্যবহার করে এমন আমার ইউটিলিটিগুলিতে কাস্টম এক্সিকিউট স্ক্রিপ্ট যুক্ত করা সহায়ক বলে মনে করেছি।

utilities.js

const { exec } = require('child_process')

module.exports.exec = (command) => {
  const process = exec(command)

  process.stdout.on('data', (data) => {
    console.log('stdout: ' + data.toString())
  })

  process.stderr.on('data', (data) => {
    console.log('stderr: ' + data.toString())
  })

  process.on('exit', (code) => {
    console.log('child process exited with code ' + code.toString())
  })
}

app.js

const { exec } = require('./utilities.js')

exec('coffee -cw my_file.coffee')

5

অন্যান্য সমস্ত উত্তর পর্যালোচনা করার পরে, আমি এটি দিয়ে শেষ করেছি:

function oldSchoolMakeBuild(cb) {
    var makeProcess = exec('make -C ./oldSchoolMakeBuild',
         function (error, stdout, stderr) {
             stderr && console.error(stderr);
             cb(error);
        });
    makeProcess.stdout.on('data', function(data) {
        process.stdout.write('oldSchoolMakeBuild: '+ data);
    });
}

কখনও কখনও dataএকাধিক লাইন হবে তাই একাধিক লাইনের জন্য oldSchoolMakeBuildশিরোনাম একবার উপস্থিত হবে। তবে এটি আমাকে এটি পরিবর্তন করার পক্ষে যথেষ্ট বিরক্ত করে নি।


3

চাইল্ড_প্রসেস.স্পান স্টডআউট এবং স্টডার স্ট্রিম সহ একটি অবজেক্ট ফেরত দেয়। শিশু প্রক্রিয়া নোডে ফেরত পাঠানো ডেটা পড়তে আপনি স্টাডাউট স্ট্রিমে আলতো চাপতে পারেন। স্টাডাউট একটি স্ট্রিম হওয়ার সাথে "ডেটা", "শেষ" এবং স্ট্রিমগুলির রয়েছে এমন অন্যান্য ইভেন্ট রয়েছে। যখন আপনি চান শিশু প্রক্রিয়াটি নোডে - প্রচুর পরিমাণে ডেটা ফিরিয়ে আনতে চান তখন ইমেজ প্রসেসিং, বাইনারি ডেটা পড়া ইত্যাদি ভাল হয় awn

যাতে আপনি নীচের মত চাইল্ড_প্রসেস.স্প্যান ব্যবহার করে আপনার সমস্যার সমাধান করতে পারেন।

var spawn = require('child_process').spawn,
ls = spawn('coffee -cw my_file.coffee');

ls.stdout.on('data', function (data) {
  console.log('stdout: ' + data.toString());
});

ls.stderr.on('data', function (data) {
  console.log('stderr: ' + data.toString());
});

ls.on('exit', function (code) {
  console.log('code ' + code.toString());
});

1

এখানে টাইপস্ক্রিপ্টে লেখা একটি অ্যাসিঙ্ক সহায়তা ফাংশন যা আমার কাছে কৌশলটি মনে করে। আমার ধারণা এটি দীর্ঘকালীন প্রক্রিয়াগুলির জন্য কাজ করবে না তবে এখনও কারও পক্ষে কার্যকর হতে পারে?

import * as child_process from "child_process";

private async spawn(command: string, args: string[]): Promise<{code: number | null, result: string}> {
    return new Promise((resolve, reject) => {
        const spawn = child_process.spawn(command, args)
        let result: string
        spawn.stdout.on('data', (data: any) => {
            if (result) {
                reject(Error('Helper function does not work for long lived proccess'))
            }
            result = data.toString()
        })
        spawn.stderr.on('data', (error: any) => {
            reject(Error(error.toString()))
        })
        spawn.on('exit', code => {
            resolve({code, result})
        })
    })
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.