<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                和進程管理相關的API單獨介紹起來比較枯燥,因此這里從一些典型的應用場景出發,分別介紹一些重要API的使用方法。 ## 如何獲取命令行參數 在NodeJS中可以通過`process.argv`獲取命令行參數。但是比較意外的是,`node`執行程序路徑和主模塊文件路徑固定占據了`argv[0]`和`argv[1]`兩個位置,而第一個命令行參數從`argv[2]`開始。為了讓`argv`使用起來更加自然,可以按照以下方式處理。 ~~~ function main(argv) { // ... } main(process.argv.slice(2)); ~~~ ## 如何退出程序 通常一個程序做完所有事情后就正常退出了,這時程序的退出狀態碼為`0`。或者一個程序運行時發生了異常后就掛了,這時程序的退出狀態碼不等于`0`。如果我們在代碼中捕獲了某個異常,但是覺得程序不應該繼續運行下去,需要立即退出,并且需要把退出狀態碼設置為指定數字,比如`1`,就可以按照以下方式: ~~~ try { // ... } catch (err) { // ... process.exit(1); } ~~~ ## 如何控制輸入輸出 NodeJS程序的標準輸入流(stdin)、一個標準輸出流(stdout)、一個標準錯誤流(stderr)分別對應`process.stdin`、`process.stdout`和`process.stderr`,第一個是只讀數據流,后邊兩個是只寫數據流,對它們的操作按照對數據流的操作方式即可。例如,`console.log`可以按照以下方式實現。 ~~~ function log() { process.stdout.write( util.format.apply(util, arguments) + '\n'); } ~~~ ## 如何降權 在Linux系統下,我們知道需要使用root權限才能監聽1024以下端口。但是一旦完成端口監聽后,繼續讓程序運行在root權限下存在安全隱患,因此最好能把權限降下來。以下是這樣一個例子。 ~~~ 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); }); ~~~ 上例中有幾點需要注意: 1. 如果是通過`sudo`獲取root權限的,運行程序的用戶的UID和GID保存在環境變量`SUDO_UID`和`SUDO_GID`里邊。如果是通過`chmod +s`方式獲取root權限的,運行程序的用戶的UID和GID可直接通過`process.getuid`和`process.getgid`方法獲取。 2. `process.setuid`和`process.setgid`方法只接受`number`類型的參數。 3. 降權時必須先降GID再降UID,否則順序反過來的話就沒權限更改程序的GID了。 ## 如何創建子進程 以下是一個創建NodeJS子進程的例子。 ~~~ 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)`方法,該方法支持三個參數。第一個參數是執行文件路徑,可以是執行文件的相對或絕對路徑,也可以是根據PATH環境變量能找到的執行文件名。第二個參數中,數組中的每個成員都按順序對應一個命令行參數。第三個參數可選,用于配置子進程的執行環境與行為。 另外,上例中雖然通過子進程對象的`.stdout`和`.stderr`訪問子進程的輸出,但通過`options.stdio`字段的不同配置,可以將子進程的輸入輸出重定向到任何數據流上,或者讓子進程共享父進程的標準輸入輸出流,或者直接忽略子進程的輸入輸出。 ## 進程間如何通訊 在Linux系統下,進程之間可以通過信號互相通信。以下是一個例子。 ~~~ /* parent.js */ var child = child_process.spawn('node', [ 'child.js' ]); child.kill('SIGTERM'); /* child.js */ process.on('SIGTERM', function () { cleanUp(); process.exit(0); }); ~~~ 在上例中,父進程通過`.kill`方法向子進程發送`SIGTERM`信號,子進程監聽`process`對象的`SIGTERM`事件響應信號。不要被`.kill`方法的名稱迷惑了,該方法本質上是用來給進程發送信號的,進程收到信號后具體要做啥,完全取決于信號的種類和進程自身的代碼。 另外,如果父子進程都是NodeJS進程,就可以通過IPC(進程間通訊)雙向傳遞數據。以下是一個例子。 ~~~ /* 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); }); ~~~ 可以看到,父進程在創建子進程時,在`options.stdio`字段中通過`ipc`開啟了一條IPC通道,之后就可以監聽子進程對象的`message`事件接收來自子進程的消息,并通過`.send`方法給子進程發送消息。在子進程這邊,可以在`process`對象上監聽`message`事件接收來自父進程的消息,并通過`.send`方法向父進程發送消息。數據在傳遞過程中,會先在發送端使用`JSON.stringify`方法序列化,再在接收端使用`JSON.parse`方法反序列化。 ## 如何守護子進程 守護進程一般用于監控工作進程的運行狀態,在工作進程不正常退出時重啟工作進程,保障工作進程不間斷運行。以下是一種實現方式。 ~~~ /* 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'); ~~~ 可以看到,工作進程非正常退出時,守護進程立即重啟工作進程。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看