亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

NodeJS感知和控制自身進(jìn)程的運(yùn)行環(huán)境和狀態(tài)

 更新時(shí)間:2024年01月01日 09:39:36   投稿:yin  
NodeJS可以感知和控制自身進(jìn)程的運(yùn)行環(huán)境和狀態(tài),也可以創(chuàng)建子進(jìn)程并與其協(xié)同工作,這使得NodeJS可以把多個(gè)程序組合在一起共同完成某項(xiàng)工作,并在其中充當(dāng)膠水和調(diào)度器的作用,和進(jìn)程管理相關(guān)的API單獨(dú)介紹起來(lái)比較枯燥,這里從一些典型的應(yīng)用場(chǎng)景出發(fā)

NodeJS可以感知和控制自身進(jìn)程的運(yùn)行環(huán)境和狀態(tài),也可以創(chuàng)建子進(jìn)程并與其協(xié)同工作,這使得NodeJS可以把多個(gè)程序組合在一起共同完成某項(xiàng)工作,并在其中充當(dāng)膠水和調(diào)度器的作用。和進(jìn)程管理相關(guān)的API單獨(dú)介紹起來(lái)比較枯燥,因此這里從一些典型的應(yīng)用場(chǎng)景出發(fā),分別介紹一些重要API的使用方法。

如何獲取命令行參數(shù)

在NodeJS中可以通過(guò)process.argv獲取命令行參數(shù)。但是比較意外的是,node執(zhí)行程序路徑和主模塊文件路徑固定占據(jù)了argv[0]argv[1]兩個(gè)位置,而第一個(gè)命令行參數(shù)從argv[2]開(kāi)始。為了讓argv使用起來(lái)更加自然,可以按照以下方式處理。

function main(argv) {
    // ...
}

main(process.argv.slice(2));

如何退出程序

通常一個(gè)程序做完所有事情后就正常退出了,這時(shí)程序的退出狀態(tài)碼為0?;蛘咭粋€(gè)程序運(yùn)行時(shí)發(fā)生了異常后就掛了,這時(shí)程序的退出狀態(tài)碼不等于0。如果我們?cè)诖a中捕獲了某個(gè)異常,但是覺(jué)得程序不應(yīng)該繼續(xù)運(yùn)行下去,需要立即退出,并且需要把退出狀態(tài)碼設(shè)置為指定數(shù)字,比如1,就可以按照以下方式:

try {
    // ...
} catch (err) {
    // ...
    process.exit(1);
}

如何控制輸入輸出

NodeJS程序的標(biāo)準(zhǔn)輸入流(stdin)、一個(gè)標(biāo)準(zhǔn)輸出流(stdout)、一個(gè)標(biāo)準(zhǔn)錯(cuò)誤流(stderr)分別對(duì)應(yīng)process.stdin、process.stdoutprocess.stderr,第一個(gè)是只讀數(shù)據(jù)流,后邊兩個(gè)是只寫(xiě)數(shù)據(jù)流,對(duì)它們的操作按照對(duì)數(shù)據(jù)流的操作方式即可。例如,console.log可以按照以下方式實(shí)現(xiàn)。

function log() {
    process.stdout.write(
        util.format.apply(util, arguments) + '\n');
}

如何降權(quán)

在Linux系統(tǒng)下,我們知道需要使用root權(quán)限才能監(jiān)聽(tīng)1024以下端口。但是一旦完成端口監(jiān)聽(tīng)后,繼續(xù)讓程序運(yùn)行在root權(quán)限下存在安全隱患,因此最好能把權(quán)限降下來(lái)。以下是這樣一個(gè)例子。

http.createServer(callback).listen(80, function () {
    var env = process.env,
        uid = parseInt(env['SUDO_UID'] || process.getuid(), 10),
        gid = parseInt(env['SUDO_GID'] || process.getgid(), 10);

    process.setgid(gid);
    process.setuid(uid);
});

上例中有幾點(diǎn)需要注意:

  • 如果是通過(guò)sudo獲取root權(quán)限的,運(yùn)行程序的用戶(hù)的UID和GID保存在環(huán)境變量SUDO_UIDSUDO_GID里邊。如果是通過(guò)chmod +s方式獲取root權(quán)限的,運(yùn)行程序的用戶(hù)的UID和GID可直接通過(guò)process.getuidprocess.getgid方法獲取。

  • process.setuidprocess.setgid方法只接受number類(lèi)型的參數(shù)。

  • 降權(quán)時(shí)必須先降GID再降UID,否則順序反過(guò)來(lái)的話(huà)就沒(méi)權(quán)限更改程序的GID了。

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

以下是一個(gè)創(chuàng)建NodeJS子進(jìn)程的例子。

var child = child_process.spawn('node', [ 'xxx.js' ]);

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

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

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

上例中使用了.spawn(exec, args, options)方法,該方法支持三個(gè)參數(shù)。第一個(gè)參數(shù)是執(zhí)行文件路徑,可以是執(zhí)行文件的相對(duì)或絕對(duì)路徑,也可以是根據(jù)PATH環(huán)境變量能找到的執(zhí)行文件名。第二個(gè)參數(shù)中,數(shù)組中的每個(gè)成員都按順序?qū)?yīng)一個(gè)命令行參數(shù)。第三個(gè)參數(shù)可選,用于配置子進(jìn)程的執(zhí)行環(huán)境與行為。

另外,上例中雖然通過(guò)子進(jìn)程對(duì)象的.stdout.stderr訪問(wèn)子進(jìn)程的輸出,但通過(guò)options.stdio字段的不同配置,可以將子進(jìn)程的輸入輸出重定向到任何數(shù)據(jù)流上,或者讓子進(jìn)程共享父進(jìn)程的標(biāo)準(zhǔn)輸入輸出流,或者直接忽略子進(jìn)程的輸入輸出。

進(jìn)程間如何通訊

在Linux系統(tǒng)下,進(jìn)程之間可以通過(guò)信號(hào)互相通信。以下是一個(gè)例子。

/* parent.js */
var child = child_process.spawn('node', [ 'child.js' ]);

child.kill('SIGTERM');

/* child.js */
process.on('SIGTERM', function () {
    cleanUp();
    process.exit(0);
});

在上例中,父進(jìn)程通過(guò).kill方法向子進(jìn)程發(fā)送SIGTERM信號(hào),子進(jìn)程監(jiān)聽(tīng)process對(duì)象的SIGTERM事件響應(yīng)信號(hào)。不要被.kill方法的名稱(chēng)迷惑了,該方法本質(zhì)上是用來(lái)給進(jìn)程發(fā)送信號(hào)的,進(jìn)程收到信號(hào)后具體要做啥,完全取決于信號(hào)的種類(lèi)和進(jìn)程自身的代碼。

另外,如果父子進(jìn)程都是NodeJS進(jìn)程,就可以通過(guò)IPC(進(jìn)程間通訊)雙向傳遞數(shù)據(jù)。以下是一個(gè)例子。

/* parent.js */
var child = child_process.spawn('node', [ 'child.js' ], {
        stdio: [ 0, 1, 2, 'ipc' ]
    });

child.on('message', function (msg) {
    console.log(msg);
});

child.send({ hello: 'hello' });

/* child.js */
process.on('message', function (msg) {
    msg.hello = msg.hello.toUpperCase();
    process.send(msg);
});

可以看到,父進(jìn)程在創(chuàng)建子進(jìn)程時(shí),在options.stdio字段中通過(guò)ipc開(kāi)啟了一條IPC通道,之后就可以監(jiān)聽(tīng)子進(jìn)程對(duì)象的message事件接收來(lái)自子進(jìn)程的消息,并通過(guò).send方法給子進(jìn)程發(fā)送消息。在子進(jìn)程這邊,可以在process對(duì)象上監(jiān)聽(tīng)message事件接收來(lái)自父進(jìn)程的消息,并通過(guò).send方法向父進(jìn)程發(fā)送消息。數(shù)據(jù)在傳遞過(guò)程中,會(huì)先在發(fā)送端使用JSON.stringify方法序列化,再在接收端使用JSON.parse方法反序列化。

如何守護(hù)子進(jìn)程

守護(hù)進(jìn)程一般用于監(jiān)控工作進(jìn)程的運(yùn)行狀態(tài),在工作進(jìn)程不正常退出時(shí)重啟工作進(jìn)程,保障工作進(jìn)程不間斷運(yùn)行。以下是一種實(shí)現(xiàn)方式。

/* daemon.js */
function spawn(mainModule) {
    var worker = child_process.spawn('node', [ mainModule ]);

    worker.on('exit', function (code) {
        if (code !== 0) {
            spawn(mainModule);
        }
    });
}

spawn('worker.js');

可以看到,工作進(jìn)程非正常退出時(shí),守護(hù)進(jìn)程立即重啟工作進(jìn)程。

到此這篇關(guān)于NodeJS感知和控制自身進(jìn)程的運(yùn)行環(huán)境和狀態(tài)的文章就介紹到這了,更多相關(guān)NodeJS感知和控制自身進(jìn)程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • nodejs npm包管理的配置方法及常用命令介紹

    nodejs npm包管理的配置方法及常用命令介紹

    這篇文章主要介紹了nodejs npm包管理的配置方法及常用命令介紹,需要的朋友可以參考下
    2014-06-06
  • Node.js 構(gòu)建命令行工具之實(shí)現(xiàn) ls 命令的 -a 和 -l 選項(xiàng)

    Node.js 構(gòu)建命令行工具之實(shí)現(xiàn) ls 命令的 -a 和 

    本文介紹了如何使用Node.js實(shí)現(xiàn)一個(gè)簡(jiǎn)單的命令行工具,模仿常用的ls命令,包括其-a和-l參數(shù)的功能,文章詳細(xì)講解了命令行參數(shù)的解析、文件類(lèi)型的判斷、權(quán)限信息的處理、文件鏈接數(shù)和修改時(shí)間的格式化等步驟,并提供了完整的代碼實(shí)現(xiàn)
    2024-11-11
  • node.js mongoose index索引操作

    node.js mongoose index索引操作

    在 Mongoose 中,索引(Index)是一種用于提高查詢(xún)性能的數(shù)據(jù)結(jié)構(gòu),它可以加速對(duì)數(shù)據(jù)庫(kù)中文檔的檢索操作,本文給大家介紹
    node.js mongoose index索引操作
    ,感興趣的朋友一起看看吧
    2023-12-12
  • nodejs事件的監(jiān)聽(tīng)與觸發(fā)的理解分析

    nodejs事件的監(jiān)聽(tīng)與觸發(fā)的理解分析

    這篇文章主要介紹了nodejs事件的監(jiān)聽(tīng)與觸發(fā)的理解分析,以實(shí)例形式對(duì)比分析了nodejs與jQuery關(guān)于事件監(jiān)聽(tīng)的實(shí)用技巧,有助于加深對(duì)nodejs的理解,需要的朋友可以參考下
    2015-02-02
  • Node.js16.15.1的一個(gè)報(bào)錯(cuò)以及解決方案分享

    Node.js16.15.1的一個(gè)報(bào)錯(cuò)以及解決方案分享

    這篇文章主要給大家介紹了關(guān)于Node.js16.15.1的一個(gè)報(bào)錯(cuò)以及解決方案的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-12-12
  • Nodejs極簡(jiǎn)入門(mén)教程(二):定時(shí)器

    Nodejs極簡(jiǎn)入門(mén)教程(二):定時(shí)器

    這篇文章主要介紹了Nodejs極簡(jiǎn)入門(mén)教程(二):定時(shí)器,本文講解了setTimeout、setInterval、setImmediate及process.nextTick等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • 快速查詢(xún)nodejs版本信息的六種方法

    快速查詢(xún)nodejs版本信息的六種方法

    Node.js是一款基于Chrome V8引擎的快速、輕量級(jí)的JavaScript運(yùn)行時(shí),隨著應(yīng)用程序規(guī)模越來(lái)越龐大,Node.js版本的更新也日益頻繁,這篇文章旨在幫助開(kāi)發(fā)者們快速查詢(xún)Node.js版本信息,需要的朋友可以參考下
    2023-11-11
  • Node.js API詳解之 vm模塊用法實(shí)例分析

    Node.js API詳解之 vm模塊用法實(shí)例分析

    這篇文章主要介紹了Node.js API詳解之 vm模塊用法,結(jié)合實(shí)例形式分析了Node.js API中vm模塊基本功能、函數(shù)、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2020-05-05
  • node-gyp安裝vuetify編譯失敗gyp?ERR的問(wèn)題及解決

    node-gyp安裝vuetify編譯失敗gyp?ERR的問(wèn)題及解決

    這篇文章主要介紹了node-gyp安裝vuetify編譯失敗gyp?ERR的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • node.js實(shí)現(xiàn)簡(jiǎn)單的壓縮/解壓縮功能示例

    node.js實(shí)現(xiàn)簡(jiǎn)單的壓縮/解壓縮功能示例

    這篇文章主要介紹了node.js實(shí)現(xiàn)簡(jiǎn)單的壓縮/解壓縮功能,結(jié)合實(shí)例形式分析了node.js實(shí)現(xiàn)本地文件與服務(wù)器端壓縮/解壓縮相關(guān)操作技巧,需要的朋友可以參考下
    2019-11-11

最新評(píng)論