国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

詳解node中創建服務進程

2024-05-06 15:17:27
字體:
來源:轉載
供稿:網友

背景

在node工程部署中,常常涉及到三方:本地客戶端、跳板機和服務器(集群)。在通過git觸發gitlab hook腳本后,需要在跳板機中執行相應的ssh命令執行shell文件啟動node服務器,這需要使用一個常用的命令setsid,這樣當ssh命令執行完畢shell退出后,node服務器仍正常運行,此時node服務進程就是一個最典型的daemon進程(后臺服務進程)。

那么,在node項目中,如何創建一個daemon進程呢?最簡單的方式,其實就是采用類似上文中介紹的方式:

代碼如下:
require('child_process').exec('setsid node app.js >/dev/null 2>&1 &');

這樣可以通過執行shell的方式實現daemon進程。不過本文的重點并不是介紹這種“命令行”的方式實現daemon進程,而且本文會詳細講述daemon進程的創建原理,且看下文。

目標

在當前業務中,之所以需要創建daemon進程就是為了保證中斷創建該進程的父進程(ctrl+c)或者父進程執行完畢后并不影響daemon進程的執行。下文介紹兩種實現方式,實現原理細節上有些出入。

下文中的所有討論都是在linux環境下進行。

實現一

在linux系統中,父進程創建出子進程,此時父進程若退出,此時子進程則變為孤兒進程,其ppid變為1,即成為init進程的子進程。在node環境下,如果不針對子進程的stdio做一些特殊處理父進程其實不會真正退出,而是直到子進程執行完畢后再退出。之所以出現這種情況是由于node創建子進程時默認會通過pipe方式將子進程的輸出導流到父進程的stream中(childProcess.stdout、childProcess.stderr),提供在父進程中輸出子進程消息的能力。

因此,解決此種問題可給子進程的stdio重新賦值:

file: parent.jslet cp = require('child_process');const sp = cp.spawn('node',['./c.js'],{  stdio: [process.stdin,process.stdout,process.stderr]});setTimeout(()=>{console.log('parent out')},5000);--------------file: c.jssetTimeout(()=>{  console.log('children exit');},10000)

通過在parent.js中設置子進程的stdio為當前終端(其實繼承了父進程的stdio),這樣父進程在5s后退出,此時子進程的ppid變為1,10s后子進程退出。

上述實現只滿足“父進程正常退出,子進程成為守護進程”的情況,一旦通過“ctrl+c”的方式終端父進程,子進程仍會退出,這還是與node底層實現有關。默認“ctrl+c”觸發SIGINT信號,父進程接受信號后發送給子進程,如果子進程存在SIGINT偵聽函數,則會執行該函數,否則執行exit系統調用子進程退出。因此,如果要讓子進程在接收到SIGINT信號不退出,只需要不作處理即可:

file: c.jsprocess.on('SIGINT',function(){  console.log('child sigint');});setTimeout(()=>{  console.log('children exit');},10000)            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 榆社县| 斗六市| 宜阳县| 施秉县| 固原市| 专栏| 台东县| 金山区| 宜兰市| 泰安市| 靖宇县| 利辛县| 湄潭县| 比如县| 定陶县| 巴中市| 马龙县| 筠连县| 南丹县| 明星| 昌平区| 阿拉尔市| 博罗县| 凤翔县| 库尔勒市| 屯昌县| 雷山县| 磴口县| 苍南县| 景宁| 社旗县| 肥城市| 岳池县| 张家川| 兴义市| 青铜峡市| 抚顺县| 靖边县| 诸暨市| 澄迈县| 英超|