最近在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中也有人指出了验证方法,如下:
- ps ax | grep PM2
- ls -l /proc/PM2_PID/cwd
- $ 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服务就可以了。
联系客服