最近在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中也有人指出了验证方法,如下:
- 先找到pm2的进程pid:
ps ax | grep PM2
- 然后查询该进程执行时所在的目录(用上一步得到的pid替换下面命令的PM2_PID)
ls -l /proc/PM2_PID/cwd
- 最后根据结果,如下的(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服务就可以了。