pm2部署node項目遇到process.cwd報錯的解決方式

此文章來源: ju.outofmemory.cn/entry/30032… github.com/Unitech/pm2…前端

問題場景

公司運維清理機器磁盤,將項目部署的代碼暴力的全刪了。這個時候每一個前端項目都須要從新部署,當部署node服務時,發現啓動失敗。node

解決思路

1. 使用pm2查看日誌

pm2 list

pm2 logs
複製代碼

發現node服務重啓失敗,報錯日誌以下:git

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)
複製代碼

2. 根據報錯信息查資料

網上查資料,發現這個報錯的緣由是pm2的啓動目錄被刪除了(刪除後重建同名目錄也是無效的)。github

什麼叫最先啓動的目錄呢?就是在命令行下第一次執行pm2時所在的目錄,好比新裝系統,在 /home/deploy 下第一次執行 pm2命令,那麼 /home/deploy 就是最先啓動的目錄。bash

再好比殺掉 pm2 進程後,再次在某個目錄下執行了 pm2 命令,那這個目錄也是最先啓動的目錄。markdown

3. 驗證 pm2 的啓動目錄是否被刪除

pm2 issues-2057中也有人指出了驗證方法,以下:運維

第一步:先找到pm2的進程pid:

ps ax | grep PM2
複製代碼

第二步:查詢該進程執行時所在的目錄(用上一步獲得的pid替換下面命令的PM2_PID)

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)

複製代碼

上面顯示的目錄已經被刪除過。oop

4. 新建 pm2 的啓動目錄

第一步:用pm2 kill命令殺掉pm2進程

pm2 kill
複製代碼

第二步:重啓pm2

cd ~ 到home目錄,執行 pm2 -v 命令ui

cd ~
pm2 -v
複製代碼

第三步:從新部署node服務

相關文章
相關標籤/搜索