位置: 编程技术 - 正文

详解node中创建服务进程(node 创建文件夹)

编辑:rootadmin

推荐整理分享详解node中创建服务进程(node 创建文件夹),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:node 创建文件,node 创建文件夹,node创建服务器的方式,node创建项目,创建nodejs项目的步骤,node *create,node *create,node创建接口,内容如对您有帮助,希望把文章链接给更多的朋友!

背景

在node工程部署中,常常涉及到三方:本地客户端、跳板机和服务器(集群)。在通过git触发gitlab hook脚本后,需要在跳板机中执行相应的ssh命令执行shell文件启动node服务器,这需要使用一个常用的命令setsid,这样当ssh命令执行完毕shell退出后,node服务器仍正常运行,此时node服务进程就是一个最典型的daemon进程(后台服务进程)。

那么,在node项目中,如何创建一个daemon进程呢?最简单的方式,其实就是采用类似上文中介绍的方式:

这样可以通过执行shell的方式实现daemon进程。不过本文的重点并不是介绍这种“命令行”的方式实现daemon进程,而且本文会详细讲述daemon进程的创建原理,且看下文。

目标

在当前业务中,之所以需要创建daemon进程就是为了保证中断创建该进程的父进程(ctrl+c)或者父进程执行完毕后并不影响daemon进程的执行。下文介绍两种实现方式,实现原理细节上有些出入。

下文中的所有讨论都是在linux环境下进行。

实现一

在linux系统中,父进程创建出子进程,此时父进程若退出,此时子进程则变为孤儿进程,其ppid变为1,即成为init进程的子进程。在node环境下,如果不针对子进程的stdio做一些特殊处理父进程其实不会真正退出,而是直到子进程执行完毕后再退出。之所以出现这种情况是由于node创建子进程时默认会通过pipe方式将子进程的输出导流到父进程的stream中(childProcess.stdout、childProcess.stderr),提供在父进程中输出子进程消息的能力。

因此,解决此种问题可给子进程的stdio重新赋值:

通过在parent.js中设置子进程的stdio为当前终端(其实继承了父进程的stdio),这样父进程在5s后退出,此时子进程的ppid变为1,s后子进程退出。

详解node中创建服务进程(node 创建文件夹)

上述实现只满足“父进程正常退出,子进程成为守护进程”的情况,一旦通过“ctrl+c”的方式终端父进程,子进程仍会退出,这还是与node底层实现有关。默认“ctrl+c”触发SIGINT信号,父进程接受信号后发送给子进程,如果子进程存在SIGINT侦听函数,则会执行该函数,否则执行exit系统调用子进程退出。因此,如果要让子进程在接收到SIGINT信号不退出,只需要不作处理即可:

以上实现,可以满足我们最初指定的目标:“父进程退出或者中断,子进程仍正常运行”。

实现二

node官方提供了创建daemon进程的相关API,如果不仔细阅读文档还真不容易发现该特性。在child_process模块中有个spawn函数,通过spawn可以执行shell命令及其相关选项,同时spawn提供了创建子进程的一些选项,其中“detached”选项则与我们的需求密切相关。

detached选项可以让node原生帮我们创建一个daemon进程,设置datached为true可以创建一个新的session和进程组,子进程的pid为新创建进程组的组pid,这与setsid起到相同的作用。此时的子进程已经和其父进程属于两个session,因此父进程的退出和中断信号不会传递给子进程,子进程不会接受到父进程的中断信号自然也不会退出。当父进程结束之后,子进程变为孤儿进程从而被init进程接收,ppid设置为1。

此时,c.js文件并未设置SIGINT事件侦听函数,在父进程中断后仍会正常运行,正是由于其和父进程分属于两个session。

在parent.js文件中设置了sp.unref()函数,目的是“避免父进程等待子进程退出”。那么为何会出现上述情况呢?这与node的事件循环有关,让父进程的事件循环排除对ChildProcess子进程对象的引用,可以使父进程单独退出。

总结

为什么上文介绍的两个方法都可以实现daemon进程呢?这还得回到系统层面进行分析。在linux系统创建一个daemon进程需要几个步骤:

1.父进程创建子进程,父进程退出,让子进程成为孤儿进程,ppid=1

2.通过setsid命令或函数在子进程中创建新的会话和进程组

3.设置当前目录

4.设置文件权限,并关闭父进程继承打开的fd

所谓会话和进程组,则是在linux多任务多用户下的概念。不同会话的进程无法通过通信,因此父子进程相隔离。而执行setsid命令则让子进程有了新的特性:

子进程脱离父进程所在的session控制,两者独立存在互不影响 子进程脱离父进程所在的进程组 子进程脱离原先的命令行终端,终端退出不影响子进程

下面再回顾方法一与方法二的区别,发现方法一其实并不是真正的daemon进程,只是通过侦听相关中断信号并设置nop函数(不执行默认的中断行为)保证子进程继续运行而已;而方法二则是标准的deamon进程创建方式,优先使用!

标签: node 创建文件夹

本文链接地址:https://www.jiuchutong.com/biancheng/379462.html 转载请保留说明!

上一篇:nodejs处理图片的中间件node-images详解(nodejs image)

下一篇:利用forever和pm2部署node.js项目过程

  • 限定性净资产账务处理
  • 申报个税需要扣除公积金和社保吗
  • 增值税期末余额在哪方
  • 免征增值税还要交印花税么
  • 广告发布需要什么手续
  • 个人所得税核定征收税率表
  • 地下建筑物应该怎样缴纳城镇土地使用税?
  • 企业外汇买卖业务流程图
  • 增值税月末结转摘要写什么
  • 融资性售后回租承租方出售资产为什么不缴纳增值税
  • 收到分包工程发票怎么做分录
  • 预付账款损失的账务处理如何编制呢?
  • 税金及附加与期间费用区别
  • 营改增后还有企业所得税吗?
  • 员工旅游费需要缴纳个人所得税吗
  • 购买垃圾袋的会计分录
  • 个体工商户可以给自己交五险一金吗
  • 购销合同的会计分录怎么写
  • 代开专票时城建税一起扣了季报怎么报税
  • 代驾费用入什么二级科目
  • 职工购房补贴面积标准
  • 归还法人前期垫付款项
  • 本月做账下月认证的进项怎么做账?
  • 外资企业股权转让如何交税
  • win7系统没有桌面图标怎么办
  • 笔记本低电量提示
  • win11如何多窗口
  • 预付账款和应付账款怎么调账
  • 发放福利视同销售进项税要转出吗?
  • wind10记事本在哪
  • redhat无法进入图形界面
  • PHP:pg_lo_create()的用法_PostgreSQL函数
  • 房地产企业土地增值税预缴
  • 支付宝消费支出
  • 实收资本一定要打进公司对公户吗
  • 建筑工程企业管理费包括哪些内容
  • 分公司注销,总公司账务处理
  • deepwiser怎么用
  • webpack打包步骤
  • 个人的无形资产
  • 应收利息的会计处理方法
  • 电子发票怎么开具?
  • 金融资产或金融负债满足下列条件之一
  • 新会计准则规定
  • 将织梦dedecms转换到wordpress
  • mongodb主备
  • 织梦官方
  • 商业保险可以从一家转到另一家吗
  • 公司pos机使用规范
  • 代收电费增值税品目
  • 人力资源劳务外包需要什么资质证书
  • 收到的稳岗补贴是否需要交税
  • 印花税计提表怎么写分录
  • 投资入股行为
  • MySQL exists 和in 详解及区别
  • windows8自动更新卡住了怎么办
  • winXP系统截图
  • win2003注册表空间不足
  • 详述目标成本法的内容和步骤
  • ubuntu1
  • 文件夹隐藏属性怎么弄
  • windows 安装app
  • win7链接联机id
  • windowsxp如何重装ie浏览器重装
  • ae安装之后打开是crash
  • 电脑dbs是什么
  • win8如何清空电脑里的所有东西
  • -mtime +3详解 linux
  • 忘记mysql root密码的解决方法
  • mac菜单栏不见了
  • 装win8还是win10
  • node.js的流的作用
  • perl 获取数据库查询结果
  • unity中国代理
  • vue用户权限解决方案
  • 八大排序算法的时间空间复杂度
  • js获取当前时间
  • 使用jquery操作dom
  • 工会经费税务代收现状
  • 土地增值税清算条例与实施细则
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设