NodeJs 重启程序时,如何保证PID不变?

NodeJs 重启程序时,如何保证PID不变? 重启程序,每次都生成不同的pid,如何做到pm2那样restart后pid依旧保持不变?

阅读 5.2k
5 个回答

只要发生进程的结束和(重新)启动,pid就一定会重新分配(有可能正好是同一个,但一般不是)。pm2我没用过,但如果你观察到一个“进程”“重启”后pid不变,那你观察的那个进程可能并不是真正被重启的进程,而是控制进程,或者说master进程没有重启,worker进程重启了,而你看到的是master进程的pid;也有可能你看到的不是pid,而是管理程序分配的内部id。

如果真的要实现pid不变而重启进程,我能想到的是调用exec,具体怎么调用估计就要写native addon了;想实现对被管理的进程透明的话可能得注入之后想办法调用exec,例如通过插桩或信号处理函数。

特地去用 pm2 试了一下,发现并没有你说的这个功能。重启之后 pid 都会发生变化

最开始我也怀疑 stopstartrestart 这三个指令可能不会杀掉系统里的进程,但是实际上并不是这样。

我做了以下操作:

  • 检查当前进程 pid=20259
  • 执行 pm2 stop 0
  • 查看 ~/.pm2/pids 目录下对应的 .pid 发现已经被删除了
  • 打开系统进程监视器查看 20259 进程已经被回收了
  • 执行 pm2 start 0
  • 再次查看 ~/.pm2/pids 目录,发现 pid 文件已创建,pid=20364
  • 查看进程监视器 20364 进程创建。

因此得出: pid 会改变,进程会被回收

思考补充:

pid 代表的是系统的进程,进程被回收则 pid 会被销毁。pid 不改变意味着进程一直占用系统资源,但是 stopped 状态的程序是不用保留系统进程的,需要销毁。
至于有没有机制可以对 restart 的进程进行 pid 保留,我不知道。

我也想知道?,用 nodemon 呢,捧在手心的呵护。

restart 是脚本吧

搜了一圈也没发现可以自定义的方法,倒是发现很多是将pid导出到文件的写法

不可能。pid是操作系统分配的,用户进程无法控制。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题