深入理解Node.js 进程与线程(8000字长文彻底搞懂)(6)
每次启动 Node.js 程序都需要在命令窗口输入命令 node app.js 才能启动,但如果把命令窗口关闭则Node.js 程序服务就会立刻断掉。除此之外,当我们这个 Node.js 服务意外崩溃了就不能自动重启进程了。这些现象都不是我们想要看到的,所以需要通过某些方式来守护这个开启的进程,执行 node app.js 开启一个服务进程之后,我还可以在这个终端上做些别的事情,且不会相互影响。,当出现问题可以自动重启。 如何实现进程守护 这里我只说一些第三方的进程守护框架,pm2 和 forever ,它们都可以实现进程守护,底层也都是通过上面讲的 child_process 模块和 cluster 模块 实现的,这里就不再提它们的原理。 pm2 指定生产环境启动一个名为 test 的 node 服务
pm2常用api
pm2 官网地址:
forever 就不特殊说明了,官网地址
注意:二者更推荐pm2,看一下二者对比就知道我为什么更推荐使用pm2了。https://www.jianshu.com/p/fdc... linux 关闭一个进程
ps aux | grep server 说明:
上面是执行命令后在linux中显示的结果,第二个参数就是进程对应的PID
kill -l PID -l选项告诉kill命令用好像启动进程的用户已注销的方式结束进程。 当使用该选项时,kill命令也试图杀死所留下的子进程。 但这个命令也不是总能成功--或许仍然需要先手工杀死子进程,然后再杀死父进程。
例如: kill -9 [PID] -9 表示强迫进程立即停止 这个强大和危险的命令迫使进程在运行时突然终止,进程在结束后不能自我清理。 危害是导致系统资源无法正常释放,一般不推荐使用,除非其他办法都无效。 当使用此命令时,一定要通过ps -ef确认没有剩下任何僵尸进程。 只能通过终止父进程来消除僵尸进程。如果僵尸进程被init收养,问题就比较严重了。 杀死init进程意味着关闭系统。 如果系统中有僵尸进程,并且其父进程是init, 而且僵尸进程占用了大量的系统资源,那么就需要在某个时候重启机器以清除进程表了。
杀死同一进程组内的所有进程。其允许指定要终止的进程的名称,而非PID。 killall httpd Node.js 线程 Node.js关于单线程的误区
仍然看本文第一段代码,创建了http服务,开启了一个进程,都说了Node.js是单线程,所以 Node 启动后线程数应该为 1,但是为什么会开启7个线程呢?难道Javascript不是单线程不知道小伙伴们有没有这个疑问? 解释一下这个原因: Node 中最核心的是 v8 引擎,在 Node 启动后,会创建 v8 的实例,这个实例是多线程的。
所以大家常说的 Node 是单线程的指的是 JavaScript 的执行是单线程的(开发者编写的代码运行在单线程环境中),但 Javascript 的宿主环境,无论是 Node 还是浏览器都是多线程的因为libuv中有线程池的概念存在的,libuv会通过类似线程池的实现来模拟不同操作系统的异步调用,这对开发者来说是不可见的。 某些异步 IO 会占用额外的线程 (编辑:ASP站长网) |