pm2部署遇到process.cwd报错的解决方法

最近在pm2.log中看见如下错误导致无法启动服务:

path.js:1144
          cwd = process.cwd();
                        ^

Error: ENOENT: no such file or directory, uv_cwd
    at Error (native)
    at Object.resolve (path.js:1144:25)
    at Function.Module._resolveLookupPaths (module.js:361:17)
    at Function.Module._resolveFilename (module.js:431:31)
    at Function.Module._load (module.js:388:25)
    at Module.require (module.js:468:17)
    at require (internal/module.js:20:19)
    at Object. (/usr/lib/node_modules/pm2/lib/ProcessContainer.js:12:15)
    at Module._compile (module.js:541:32)
    at Object.Module._extensions..js (module.js:550:10)

于是google之,在https://github.com/Unitech/pm2/issues/2057找到方法解决,记录如下:

首先导致这个错误是因为pm2最早启动的目录被删除了(删除后重建同名目录也是无用的)。

什么叫最早启动的目录呢?就是在命令行下第一次执行pm2时所在的目录,比如新装系统,在 /home/deploy 下第一次执行 pm2命令,那么 /home/deploy 就是最早启动的目录。再比如杀掉pm2进程后,再次在某个目录下执行了pm2命令,那这个目录也是最早启动的目录。

理解了最早启动的目录,那么当pm2启动后,把该目录删除过一次,则再次用pm2去启动node服务时就会报以上错误。

pm2 issues-2057中也有人指出了验证方法,如下:

  1. 先找到pm2的进程pid:
    ps ax | grep PM2
    
  2. 然后查询该进程执行时所在的目录(用上一步得到的pid替换下面命令的PM2_PID)
    ls -l /proc/PM2_PID/cwd
    
  3. 最后根据结果,如下的(deleted)标注,就说明该目录被删除过。
    $ ls -l /proc/24016/cwd
    lrwxrwxrwx 1 root root 0 Feb 4 17:04 /proc/24016/cwd -> /home/nodejs/deploy(deleted)
    

验证原因后,解决方法就是重新在另外一个安全一些的目录重启pm2进程。

先用pm2 kill命令杀掉pm2进程,然后 cd ~ 到home目录,执行 pm2 -v 命令,这样就在一个相对安全的目录启动了pm2。最后再去部署node服务就可以了。

http://cssor.com/pm2-deploy-process-cwd-error.html

参与评论

电子邮件地址不会被公开。 必填项已用*标注

*

全部分类
Books(4)code(7)database(6)html&css(24)java(11)JavaScript(48)jQuery(24)linux(20)python(1)React(1)share(1)soft(4)solution(53)thinking(17)vim(9)WordPress(8)前端优化(12)拓展(33)服务器(31)移动开发(4)自然(22)