最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Node.js中創(chuàng)建和管理外部進(jìn)程詳解

 更新時(shí)間:2014年08月16日 11:13:30   作者:Jack Yao  
這篇文章主要介紹了Node.js中創(chuàng)建和管理外部進(jìn)程詳解,本文講解了執(zhí)行外部命令的方法、子進(jìn)程相關(guān)內(nèi)容等,需要的朋友可以參考下

Node被設(shè)計(jì)用來高效的處理I/O操作,但是你應(yīng)該知道,有些類型的程序并不適合這種模式。比如,如果你打算用Node處理一個(gè)CPU密集的任務(wù),你可能會堵塞事件循環(huán),并因此降低了程序的響應(yīng)。替代辦法是,把CPU密集的任務(wù)分配給一個(gè)單獨(dú)的進(jìn)程來處理,從而釋放事件循環(huán)。Node允許你產(chǎn)生進(jìn)程,并把這個(gè)新進(jìn)程做為它父進(jìn)程的子進(jìn)程。在Node里,子進(jìn)程可以和父進(jìn)程進(jìn)行雙向通信,而且在某種程度上,父進(jìn)程還可以監(jiān)控和管理子進(jìn)程。

另外一種需要使用子進(jìn)程的情況是,當(dāng)你想簡單地執(zhí)行一個(gè)外部命令,并讓Node獲取命令的返回值時(shí)。比如,你可以執(zhí)行一個(gè)UNIX命令、腳本或者其他那些不能在Node里直接執(zhí)行的命令。

本章將向你展示如何執(zhí)行外部命令,創(chuàng)建,并和子進(jìn)程通信,以及終結(jié)子進(jìn)程。重點(diǎn)是讓你了解如何在Node進(jìn)程外完成一系列任務(wù)。

執(zhí)行外部命令

當(dāng)你需要執(zhí)行一個(gè)外部shell命令或可執(zhí)行文件時(shí),你可以使用child_process模塊,像這樣導(dǎo)入它:

復(fù)制代碼 代碼如下:

var child_process = require(‘child_process')

然后可以用模塊內(nèi)的exec函數(shù)來執(zhí)行外部命令:
復(fù)制代碼 代碼如下:

var exec = child_process.exec;

exec(command,callback);


exec的第一個(gè)參數(shù)是你準(zhǔn)備執(zhí)行的shell命令字符串,第二個(gè)參數(shù)是一個(gè)回調(diào)函數(shù)。這個(gè)回調(diào)函數(shù)將會在exec執(zhí)行完外部命令或者有錯(cuò)誤發(fā)生時(shí)被調(diào)用?;卣{(diào)函數(shù)有三個(gè)參數(shù):error,stdout,stderr,看下面的例子:
復(fù)制代碼 代碼如下:

exec(‘ls',function(err,stdout,stderr){

         //譯者注:如果使用windows,可改為windows命令,比如dir,后面不再贅述

});

如果有錯(cuò)誤發(fā)生,第一個(gè)參數(shù)將會是一個(gè)Error類的實(shí)例,如果第一個(gè)參數(shù)不包含錯(cuò)誤,那么第二個(gè)參數(shù)stdout將會包含命令的標(biāo)準(zhǔn)輸出。最后一個(gè)參數(shù)包含命令相關(guān)的錯(cuò)誤輸出。

列表8-1 展示了一個(gè)復(fù)雜些的執(zhí)行外部命令的例子

LISTING 8-1:執(zhí)行外部命令(源碼:chapter8/01_external_command.js)

復(fù)制代碼 代碼如下:

//導(dǎo)入child_process模塊的exec函數(shù)
var exec = require(‘child_process').exec;
//調(diào)用“cat *.js | wc -l”命令
exec(‘cat *.js | wc –l ‘, function(err, stdout, stderr ){  //第四行
         //命令退出或者調(diào)用失敗
         if( err ){
              //啟動外部進(jìn)程失敗
              console.log(‘child_process 退出,錯(cuò)誤碼是:',err.code);
              return;
         }
}

第四行,我們把“cat *.js | wc -l”作為第一個(gè)參數(shù)傳遞給exec,你也可以嘗試任何其它命令,只要你在shell里使用過的命令都可以。

然后將一個(gè)回調(diào)函數(shù)作為第二個(gè)參數(shù),它將會在錯(cuò)誤發(fā)生或者子進(jìn)程終結(jié)的時(shí)候被調(diào)用。

還可以在回調(diào)函數(shù)之前傳遞第三個(gè)可選參數(shù),它包含一些配置選項(xiàng),比如:

復(fù)制代碼 代碼如下:

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

var options ={
         timeout: 1000,
         killSignal: ‘SIGKILL'
     };

exec(‘cat *.js | wc –l ‘, options, function(err,stdout,stderr){
         //…
});

可以使用的參數(shù)有:

1.cwd —— 當(dāng)前目錄,可以指定當(dāng)前工作目錄。
2.encoding —— 子進(jìn)程輸出內(nèi)容的編碼格式,默認(rèn)值是”utf8”,也就是UTF-8編碼。如果子進(jìn)程的輸出不是utf8,你可以用這個(gè)參數(shù)來設(shè)置,支持的編碼格式有:

復(fù)制代碼 代碼如下:

ascii
utf8
ucs2
base64

如果你想了解Node支持的這些編碼格式的更多信息,請參考第4章“使用Buffer處理,編碼,解碼二進(jìn)制數(shù)據(jù)”。

1.timeout —— 以毫秒為單位的命令執(zhí)行超時(shí)時(shí)間,默認(rèn)是0,即無限制,一直等到子進(jìn)程結(jié)束。
2.maxBuffer —— 指定stdout流和stderr流允許輸出的最大字節(jié)數(shù),如果達(dá)到最大值,子進(jìn)程會被殺死。默認(rèn)值是200*1024。
3.killSignal —— 當(dāng)超時(shí)或者輸出緩存達(dá)到最大值時(shí)發(fā)送給子進(jìn)程的終結(jié)信號。默認(rèn)值是“SIGTERM”,它將給子進(jìn)程發(fā)送一個(gè)終結(jié)信號。通常都會使用這種有序的方式來結(jié)束進(jìn)程。當(dāng)用SIGTERM信號時(shí),進(jìn)程接收到以后還可以進(jìn)行處理或者重寫信號處理器的默認(rèn)行為。如果目標(biāo)進(jìn)程需要,你可以同時(shí)向他傳遞其它的信號(比如SIGUSR1)。你也可以選擇發(fā)送一個(gè)SIGKILL信號,它會被操作系統(tǒng)處理并強(qiáng)制立刻結(jié)束子進(jìn)程,這樣的話,子進(jìn)程的任何清理操作都不會被執(zhí)行。

如果你想更進(jìn)一步的控制進(jìn)程的結(jié)束,可以使用child_process.spawn命令,后面會介紹。

1.evn —— 指定傳遞給子進(jìn)程的環(huán)境變量,默認(rèn)是null,也就是說子進(jìn)程會繼承在它被創(chuàng)建之前的所有父進(jìn)程的環(huán)境變量。

注意:使用killSignal選項(xiàng),你可以以字符串的形式向目標(biāo)進(jìn)程發(fā)送信號。在Node里信號以字符串的形式存在,下面是UNIX信號和對應(yīng)默認(rèn)操作的列表:

你可能想為子進(jìn)程提供一組可擴(kuò)展的父級環(huán)境變量。如果直接去修改process.env對象,你會改變Node進(jìn)程內(nèi)所有模塊的環(huán)境變量,這樣會惹很多麻煩。替代方案是,創(chuàng)建一個(gè)新對象,復(fù)制process.env里的所有參數(shù),見例子8-2:

LISTING 8-2:使用參數(shù)化的環(huán)境變量來執(zhí)行命令(源碼:chapter8/02_env_vars_augment.js)

復(fù)制代碼 代碼如下:

var env = process.env,
    varName,
    envCopy = {},
    exec = require(‘child_prcess').exec;
//將process.env復(fù)制到envCopy
for( vaName in ev){
    envCopy[varName] = env[varName];
}

//設(shè)置一些自定義變量
envCopy[‘CUSTOM ENV VAR1'] = ‘some value';
envCopy[‘CUSTOM ENV VAR2'] = ‘some other value';

//使用process.env和自定義變量來執(zhí)行命令
exec(‘ls –la',{env: envCopy}, function(err,stdout,stderr){
    if(err){ throw err; }
    console.log(‘stdout:', stdout);
    console.log(‘stderr:',stderr);
}

上面例子,創(chuàng)建了一個(gè)用來保存環(huán)境變量的envCopy變量,它首先從process.env那里復(fù)制Node進(jìn)程的環(huán)境變量,然后又添加或替換了一些需要修改的環(huán)境變量,最后把envCopy作為環(huán)境變量參數(shù)傳遞給exec函數(shù)并執(zhí)行外部命令。

記住,環(huán)境變量是通過操作系統(tǒng)在進(jìn)程之間傳遞的,所有類型的環(huán)境變量值都是以字符串的形式到達(dá)子進(jìn)程的。比如,如果父進(jìn)程將數(shù)字123作為一個(gè)環(huán)境變量,子進(jìn)程將會以字符串的形式接收“123”。

下面的例子,將在同一個(gè)目錄里建立2個(gè)Node腳本:parent.js和child.js,第一個(gè)腳本將會調(diào)用第二個(gè),下面我們來創(chuàng)建這兩個(gè)文件:

LISTING 8-3: 父進(jìn)程設(shè)置環(huán)境變量(chapter8/03_environment_number_parent.js)

復(fù)制代碼 代碼如下:

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

exec('node child.js', {env: {number: 123}}, function(err, stdout, stderr) {

if (err) { throw err; }

    console.log('stdout:\n', stdout);

    console.log('stderr:\n', stderr);

});

把這段代碼保存到parent.js,下面是子進(jìn)程的源碼,把它們保存到child.js(見例8-4)

例 8-4: 子進(jìn)程解析環(huán)境變量(chapter8/04_environment_number_child.js)

復(fù)制代碼 代碼如下:

var   number = process.env.number;

console.log(typeof(number)); // → "string"

number = parseInt(number, 10);

console.log(typeof(number)); // → "number"

當(dāng)你把這個(gè)文件保存為child.js后,就可以在這個(gè)目錄下運(yùn)行下面的命令:

復(fù)制代碼 代碼如下:

$ node parent.js

將會看到如下的輸出:

復(fù)制代碼 代碼如下:

sdtou:

string

number

stderr:

可以看到,盡管父進(jìn)程傳遞了一個(gè)數(shù)字型的環(huán)境變量,但是子進(jìn)程卻以字符串形式接收它(參見輸出的第二行),在第三行你把這個(gè)字符串解析成了一個(gè)數(shù)字。

生成子進(jìn)程

如你所見,可以使用child_process.exec()函數(shù)來啟動外部進(jìn)程,并在進(jìn)程結(jié)束的時(shí)候調(diào)用你的回調(diào)函數(shù),這樣用起來很簡單,不過也有一些缺點(diǎn):

1.除了使用命令行參數(shù)和環(huán)境變量,使用exec()無法和子進(jìn)程通信
2.子進(jìn)程的輸出是被緩存的,因此你無法流化它,它可能會耗盡內(nèi)存

幸運(yùn)的是,Node的child_process模塊允許更細(xì)粒度的控制子進(jìn)程的啟動,停止,及其它常規(guī)操作。你可以在應(yīng)用程序里啟動一個(gè)新的子進(jìn)程,Node提供一個(gè)雙向的通信通道,可以讓父進(jìn)程和子進(jìn)程相互收發(fā)字符串?dāng)?shù)據(jù)。父進(jìn)程還可以有些針對子進(jìn)程的管理操作,給子進(jìn)程發(fā)送信號,以及強(qiáng)制關(guān)閉子進(jìn)程。

創(chuàng)建子進(jìn)程

你可以使用child_process.spawn函數(shù)來創(chuàng)建一個(gè)新的子進(jìn)程,見例8-5:

例 8-5: 生成子進(jìn)程。 (chapter8/05_spawning_child.js)

復(fù)制代碼 代碼如下:

// 導(dǎo)入child_process模塊的spawn函數(shù)

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

// 生成用來執(zhí)行 "tail -f /var/log/system.log"命令的子進(jìn)程

var child = spawn('tail', ['-f', '/var/log/system.log']);

上面代碼生成了一個(gè)用來執(zhí)行tail命令的子進(jìn)程,并將“-f”和“/bar/log/system.log”作為參數(shù)。tail命令將會監(jiān)控/var/log/system.og文件(如果存在的話),然后將所有追加的新數(shù)據(jù)輸出到stdout標(biāo)準(zhǔn)輸出流。spawn函數(shù)返回一個(gè)ChildProcess對象,它是一個(gè)指針對象,封裝了真實(shí)進(jìn)程的訪問接口。這個(gè)例子里我們把這個(gè)新的描述符賦值給一個(gè)叫做child的變量。

監(jiān)聽來自子進(jìn)程的數(shù)據(jù)

任何包含stdout屬性的子進(jìn)程句柄,都會將子進(jìn)程的標(biāo)準(zhǔn)輸出stdout作為一個(gè)流對象,你可以在這個(gè)流對象上綁定data事件,這樣每當(dāng)有數(shù)據(jù)塊可用時(shí),就會調(diào)用對應(yīng)的回調(diào)函數(shù),見下面的例子:

復(fù)制代碼 代碼如下:

 //將子進(jìn)程的輸出打印到控制臺

child.stdout.on(‘data',function(data){

         console.log(‘tail output: ‘ + data);

});

每當(dāng)子進(jìn)程將數(shù)據(jù)輸出到標(biāo)準(zhǔn)輸出stdout時(shí),父進(jìn)程就會得到通知并把數(shù)據(jù)打印到控制臺。

除了標(biāo)準(zhǔn)輸出,進(jìn)程還有另外一個(gè)默認(rèn)輸出流:標(biāo)準(zhǔn)錯(cuò)誤流,通常用這個(gè)流來輸出錯(cuò)誤信息。

在這個(gè)例子里,如果/var/log/system.log文件不存在,tail進(jìn)程將會輸出類似下面的消息:“/var/log/system.log:No such file or directory”,通過監(jiān)聽stderr流,父進(jìn)程會在這種錯(cuò)誤發(fā)生時(shí)得到通知。

父進(jìn)程可以這樣監(jiān)聽標(biāo)準(zhǔn)錯(cuò)誤流:

復(fù)制代碼 代碼如下:

child.stderr.on('data', function(data) {

    console.log('tail error output:', data);

});

 stderr屬性和stdout一樣,也是只讀流,每當(dāng)子進(jìn)程往標(biāo)準(zhǔn)錯(cuò)誤流里輸出數(shù)據(jù)時(shí),父進(jìn)程就會得到通知,并輸出數(shù)據(jù)。

發(fā)送數(shù)據(jù)到子進(jìn)程

除了從子進(jìn)程的輸出流里接收數(shù)據(jù),父進(jìn)程還可以通過childPoces.stdin屬性往子進(jìn)程的標(biāo)準(zhǔn)輸入里寫入數(shù)據(jù),以此來往子進(jìn)程發(fā)送數(shù)據(jù)。

子進(jìn)程可以通過process.stdin只讀流來監(jiān)聽標(biāo)準(zhǔn)輸入的數(shù)據(jù),但是注意你首先必須得恢復(fù)(resume)標(biāo)準(zhǔn)輸入流,因?yàn)樗J(rèn)處于暫停(paused)狀態(tài)。

例8-6將會創(chuàng)建一個(gè)包含如下功能的程序:

1.+1 應(yīng)用:一個(gè)簡單的應(yīng)用程序,可以從標(biāo)準(zhǔn)輸入接收整型,然后相加,再把相加以后的結(jié)果輸出到標(biāo)準(zhǔn)輸出流。這個(gè)應(yīng)用作為一個(gè)簡單的計(jì)算服務(wù), 把Node進(jìn)程模擬成一個(gè)可以執(zhí)行特定工作的外部服務(wù)。

2.測試+1應(yīng)用的客戶端,發(fā)送隨機(jī)整型,然后輸出結(jié)果。用來演示Node進(jìn)程如何生成一個(gè)子進(jìn)程然后讓它執(zhí)行特定的任務(wù)。

用下面例8-6的代碼創(chuàng)建一個(gè)名為plus_one.js的文件:

例 8-6: +1 應(yīng)用程序(chapter8/06_plus_one.js)

復(fù)制代碼 代碼如下:

// 恢復(fù)默認(rèn)是暫停狀態(tài)的標(biāo)準(zhǔn)輸入流
process.stdin.resume();
process.stdin.on('data', function(data) {
    var number;
    try {
        // 將輸入數(shù)據(jù)解析為整型
        number = parseInt(data.toString(), 10);
        // +1
        number += 1;
        // 輸出結(jié)果
        process.stdout.write(number + "\n");
    } catch(err) {
        process.stderr.write(err.message + "\n");
    }
});

上面代碼里,我們等待來自stdin標(biāo)準(zhǔn)輸入流的數(shù)據(jù),每當(dāng)有數(shù)據(jù)可用,就假設(shè)它是個(gè)整型并把它解析到一個(gè)整型變量里,然后加1,并把結(jié)果輸出到標(biāo)準(zhǔn)輸出流。

可以通過下面命令來運(yùn)行這個(gè)程序:

復(fù)制代碼 代碼如下:

    $ node plus_one.js

運(yùn)行后程序就開始等待輸入,如果你輸入一個(gè)整數(shù)然后按回車,就會看到一個(gè)被加1以后的數(shù)字被顯示到屏幕上。

可以通過按Ctrl-C來退出程序。

一個(gè)測試客戶端

現(xiàn)在你要?jiǎng)?chuàng)建一個(gè)Node進(jìn)程來使用前面的“+1應(yīng)用”提供的計(jì)算服務(wù)。

首先創(chuàng)建一個(gè)名為plus_one_test.js的文件,內(nèi)容見例8-7:

例 8-7: 測試+1應(yīng)用(chapter8/07_plus_one_test.js)

復(fù)制代碼 代碼如下:

var spawn = require('child_process').spawn;
// 生成一個(gè)子進(jìn)程來執(zhí)行+1應(yīng)用
var child = spawn('node', ['plus_one.js']);
// 每一秒調(diào)用一次函數(shù)
setInterval(function() {
    // Create a random number smaller than 10.000
    var number = Math.floor(Math.random() * 10000);
    // Send that number to the child process:
    child.stdin.write(number + "\n");
    // Get the response from the child process and print it:
    child.stdout.once('data', function(data) {
        console.log('child replied to ' + number + ' with: ' + data);
    });
}, 1000);
child.stderr.on('data', function(data) {
    process.stdout.write(data);
});

 從第一行到第四行啟動了一個(gè)用來運(yùn)行“+1應(yīng)用”的子進(jìn)程,然后使用setInterval函數(shù)每秒鐘執(zhí)行一次下列操作:

1..新建一個(gè)小于10000的隨機(jī)數(shù)
2.將這個(gè)數(shù)字作為字符串傳遞給子進(jìn)程
3.等待子進(jìn)程回復(fù)一個(gè)字符串
4.因?yàn)槟阆朊看沃唤邮?個(gè)數(shù)字的計(jì)算結(jié)果,因此需要使用child.stdout.once而不是child.stdout.on。如果使用了后者,會每隔1秒注冊一個(gè)data事件的回調(diào)函數(shù),每個(gè)被注冊的回調(diào)函數(shù)都會在子進(jìn)程的stdout接收到數(shù)據(jù)時(shí)被執(zhí)行,這樣你會發(fā)現(xiàn)同一個(gè)計(jì)算結(jié)果會被輸出多次,這種行為顯然是錯(cuò)的。

在子進(jìn)程退出時(shí)接收通知

當(dāng)子進(jìn)程退出時(shí),exit事件會被觸發(fā)。例8-8展示了如何監(jiān)聽它:

例 8-8: 監(jiān)聽子進(jìn)程的退出事件 (chapter8/09_listen_child_exit.js)

復(fù)制代碼 代碼如下:

var spawn = require('child_process').spawn;
// 生成子進(jìn)程來執(zhí)行 "ls -la"命令
var child = spawn('ls', ['-la']);
child.stdout.on('data', function(data) {
    console.log('data from child: ' + data);
});

// 當(dāng)子進(jìn)程退出:
<strong>child.on('exit', function(code) {
    console.log('child process terminated with code ' + code);
});</strong>

最后幾行加黑的代碼,父進(jìn)程使用子進(jìn)程的exit事件來監(jiān)聽它的退出事件,當(dāng)事件發(fā)生時(shí),控制臺顯示相應(yīng)的輸出。子進(jìn)程的退出碼會被作為第一個(gè)參數(shù)傳遞給回調(diào)函數(shù)。有些程序使用一個(gè)非0的退出碼來代表某種失敗狀態(tài)。比如,如果你嘗試執(zhí)行命令“l(fā)s –al click filename.txt”,但是當(dāng)前目錄沒有這個(gè)文件,你就會得到一個(gè)值為1的退出碼,見例8-9:

例8-9:獲得子進(jìn)程的退出碼 (chapter8/10_child_exit_code.js)

復(fù)制代碼 代碼如下:

var spawn = require('child_process').spawn;
// 生成子進(jìn)程,執(zhí)行"ls does_not_exist.txt" 命令
var child = spawn('ls', ['does_not_exist.txt']);
// 當(dāng)子進(jìn)程退出
child.on('exit', function(code) {
    console.log('child process terminated with code ' + code);
});

這個(gè)例子里,exit事件觸發(fā)了回調(diào)函數(shù),并把子進(jìn)程的退出碼作為第一個(gè)參數(shù)傳遞給它。如果子進(jìn)程是被信號殺死而導(dǎo)致的非正常退出,那么相應(yīng)的信號代碼會被當(dāng)作第二個(gè)參數(shù)傳遞給回調(diào)函數(shù),如例8-10:

LISTING 8-10: 獲得子進(jìn)程的退出信號(chapter8/11_child_exit_signal.js)

復(fù)制代碼 代碼如下:

var spawn = require('child_process').spawn;
// 生成子進(jìn)程,運(yùn)行"sleep 10"命令
var child = spawn('sleep', ['10']);
setTimeout(function() {
    child.kill();
}, 1000);
child.on('exit', function(code, signal) {
    if (code) {
        console.log('child process terminated with code ' + code);
    } else if (signal) {
        console.log('child process terminated because of signal ' + signal);
    }
});

這個(gè)例子里,啟動一個(gè)子進(jìn)程來執(zhí)行sleep 10秒的操作,但是還沒到10秒就發(fā)送了一個(gè)SIGKILL信號給子進(jìn)程,這將會導(dǎo)致如下的輸出:

復(fù)制代碼 代碼如下:

child process terminated because of signal SIGTERM

發(fā)送信號并殺死進(jìn)程

在這部分,你將學(xué)習(xí)如何使用信號來管理子進(jìn)程。信號是父進(jìn)程用來跟子進(jìn)程通信,甚至殺死子進(jìn)程的一種簡單方式。

不同的信號代碼代表不同的含義,有很多信號,其中最常見的一些是用來殺死進(jìn)程的。如果一個(gè)進(jìn)程接收到一個(gè)它不知道如何處理的信號,程序就會被異常中斷。有些信號會被子進(jìn)程處理,而有些只能由操作系統(tǒng)處理。

一般情況下,你可以使用child.kill方法來向子進(jìn)程發(fā)送一個(gè)信號,默認(rèn)發(fā)送SIGTERM信號:

復(fù)制代碼 代碼如下:

var spawn = require('child_process').spawn;
var child = spawn('sleep', ['10']);
setTimeout(function() {
    child.kill();
}, 1000);

還可以通過傳入一個(gè)標(biāo)識信號的字符串作為kill方法的唯一參數(shù),來發(fā)送某個(gè)特定的信號:

復(fù)制代碼 代碼如下:

child.kill(‘SIGUSR2');

需要注意的是,雖然這個(gè)方法的名字叫kill,但是發(fā)送的信號并不一定會殺死子進(jìn)程。如果子進(jìn)程處理了信號,默認(rèn)的信號行為就會被覆蓋。用Node寫的子進(jìn)程可以像下面這樣重寫信號處理器的定義:

復(fù)制代碼 代碼如下:

process.on('SIGUSR2', function() {
    console.log('Got   a SIGUSR2 signal');
});

現(xiàn)在,你定義了SIGUSR2的信號處理器,當(dāng)你的進(jìn)程再收到SIGUSR2信號的時(shí)候就不會被殺死,而是輸出“Got a SIGUSR2 signal”這句話。使用這種機(jī)制,你可以設(shè)計(jì)一種簡單的方式來跟子進(jìn)程溝通甚至命令它。雖然不像使用標(biāo)準(zhǔn)輸入功能那么豐富,但是這方式要簡單很多。

小結(jié)

這一章,學(xué)習(xí)了使用child_process.exec方法來執(zhí)行外部命令,這種方式可以不使用命令行參數(shù),而是通過定義環(huán)境變量的方式把參數(shù)傳遞給子進(jìn)程。

還學(xué)習(xí)了通過調(diào)用child_process.spawn方法生成子進(jìn)程的方式來調(diào)用外部命令,這種方式你可以使用輸入流,輸出流來跟子進(jìn)程通信,或者使用信號來跟子進(jìn)程通信以及殺死進(jìn)程。

相關(guān)文章

  • nodejs的10個(gè)性能優(yōu)化技巧

    nodejs的10個(gè)性能優(yōu)化技巧

    在我接觸JavaScript(無論瀏覽器還是NodeJS)的時(shí)間里,總是遇到有朋友有多線程的需求。而在NodeJS方面,有朋友甚至直接說到,NodeJS是單線程的,無法很好的利用多核CPU。那么我們在使用過程中,就要非常注意性能優(yōu)化了
    2014-07-07
  • node.js中g(shù)et和post接口教程

    node.js中g(shù)et和post接口教程

    這篇文章主要介紹了node.js中g(shù)et和post接口學(xué)習(xí),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • node.js實(shí)現(xiàn)復(fù)制文本到剪切板的功能

    node.js實(shí)現(xiàn)復(fù)制文本到剪切板的功能

    這篇文章主要給大家介紹了node.js實(shí)現(xiàn)復(fù)制文本到剪切板的功能,文中介紹的非常詳細(xì),并給出示例代碼,相信對大家具有一定的參考借鑒價(jià)值,有需要的朋友們下面來一起看看吧。
    2017-01-01
  • 如何利用node實(shí)現(xiàn)靜態(tài)文件緩存詳解

    如何利用node實(shí)現(xiàn)靜態(tài)文件緩存詳解

    HTTP 緩存機(jī)制作為 Web 應(yīng)用性能優(yōu)化的重要手段,對于從事 Web 開發(fā)的同學(xué)們來說,應(yīng)該是知識體系的基礎(chǔ)環(huán)節(jié),也是想要成為前端架構(gòu)的必備技能,這篇文章主要給大家介紹了關(guān)于如何利用node實(shí)現(xiàn)靜態(tài)文件緩存的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • Node.js之刪除文件夾(含遞歸刪除)代碼實(shí)例

    Node.js之刪除文件夾(含遞歸刪除)代碼實(shí)例

    這篇文章主要介紹了Node.js之刪除文件夾(含遞歸刪除)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • NodeJs 模仿SIP話機(jī)注冊的方法

    NodeJs 模仿SIP話機(jī)注冊的方法

    這篇文章主要介紹了NodeJs 模仿SIP話機(jī)注冊的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Node與Python 雙向通信的實(shí)現(xiàn)代碼

    Node與Python 雙向通信的實(shí)現(xiàn)代碼

    最簡單粗暴的通信方式是 Nodejs調(diào)用一下 Python 腳本,本文詳細(xì)介紹了Nodejs與Python 雙向通信的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • npm與node版本不匹配問題解決思路及方法

    npm與node版本不匹配問題解決思路及方法

    當(dāng)nodejs和npm的版本不匹配時(shí),會出現(xiàn)一些奇怪的報(bào)錯(cuò),這是因?yàn)閚pm與nodejs版本不兼容導(dǎo)致的,這篇文章主要給大家介紹了關(guān)于npm與node版本不匹配問題解決思路及方法的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • 使用Node.js獲取電腦配置信息的實(shí)現(xiàn)方法(CPU型號、內(nèi)存大小、磁盤類型等)

    使用Node.js獲取電腦配置信息的實(shí)現(xiàn)方法(CPU型號、內(nèi)存大小、磁盤類型等)

    在日常的開發(fā)工作中,我們有時(shí)需要了解電腦的硬件配置,比如CPU型號、內(nèi)存大小、磁盤類型等,這些信息對于性能優(yōu)化、系統(tǒng)配置等場景非常重要,今天,我們就來聊聊如何用Node.js輕松獲取這些信息,感興趣的小伙伴跟著小編一起來看看吧
    2025-04-04
  • 利用node.js實(shí)現(xiàn)自動生成前端項(xiàng)目組件的方法詳解

    利用node.js實(shí)現(xiàn)自動生成前端項(xiàng)目組件的方法詳解

    最近在學(xué)習(xí)用,基于nodejs的強(qiáng)大,我從原本的只寫前端變成了寫全棧。下面這篇文章主要給大家介紹了關(guān)于利用node.js實(shí)現(xiàn)自動生成前端項(xiàng)目組件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面來一起看看吧。
    2017-07-07

最新評論

四川省| 威信县| 韶关市| 连云港市| 军事| 增城市| 青铜峡市| 故城县| 伊金霍洛旗| 前郭尔| 博白县| 西藏| 博野县| 固安县| 澎湖县| 鞍山市| 喀喇沁旗| 吉林省| 左权县| 甘德县| 大港区| 宕昌县| 东乌珠穆沁旗| 莲花县| 邮箱| 东乡| 从江县| 芜湖市| 平罗县| 芦溪县| 高台县| 贡觉县| 滁州市| 白银市| 长沙市| 婺源县| 祥云县| 宝清县| 五指山市| 庆云县| 康保县|