【问题标题】:Restarting pm2 from cron/shellJS - bcrypt version error从 cron/shellJS 重新启动 pm2 - bcrypt 版本错误
【发布时间】:2020-02-22 06:47:33
【问题描述】:

我正在尝试在 Ubuntu 18.04 中设置 crontab 进程以定期检查 pm2 的状态并在必要时重新启动它。因为我更熟悉 JavaScript,所以我决定让 crontab 进程运行一个节点文件,该文件从 pm2 获取 JSON 读数,以检查 pm2 中每个应用程序的状态。如果检测到任何问题,JS 文件将使用shellJS 执行另一个bash 脚本。就这样:

  1. Crontab
  2. 节点脚本
  3. 如果 pm2 应用出现问题,请执行 bash 脚本
  4. 删除现有的 pm2 应用并启动它的新实例

但是,当我从 JS 文件执行此操作时,我收到以下源自 bcrypt 的错误:

Error: The module '/root/myProject/node_modules/bcrypt/lib/binding/bcrypt_lib.node'
was compiled against a different Node.js version using
NODE_MODULE_VERSION 67. This version of Node.js requires
NODE_MODULE_VERSION 57. Please try re-compiling or re-installing
the module (for instance, using `npm rebuild` or `npm install`).
    at Object.Module._extensions..node (module.js:681:18)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Module.require (module.js:596:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/root/myProject/node_modules/bcrypt/bcrypt.js:6:16)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Module.require (module.js:596:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/root/myProject/models/User.js:3:16)
    at Module._compile (module.js:652:30)

这很奇怪。如果我从命令行运行 bash 脚本,或者直接在命令行中运行命令,我不会收到错误 - 只有当我从 shellJS/node 启动它时。

这是从节点调用它的行:

shell.exec('/var/scripts/restart-pm2.sh')

这是restart-pm2.sh 文件中的行:

pm2 start /root/ecosystem.config.js --only index

再一次,运行那个确切的命令可以正常工作。

更新:

我尝试直接从 cron 运行 bash 脚本,但我也得到了错误。因此,显然不是 shellJS/node 导致错误,而是与 cron 上下文有关。

【问题讨论】:

  • 您是否碰巧在使用诸如nnvmnvs 之类的节点版本管理器?
  • 我能够找到它并添加了答案。除了/usr/local/bin/node 中的内容之外,我不确定它还可以引用什么其他版本的节点,但这似乎可以解决它。

标签: node.js bash bcrypt pm2 shelljs


【解决方案1】:

我想出了一个解决方案。我注意到在测试 bash 脚本时,我需要确保在 ecosystem.config.js 文件中有绝对路径引用,以使其在 bash 脚本/cron 中工作。显然,该文件还需要对节点版本的绝对引用。无论出于何种原因,它仅在从 cron 调用时才需要。

所以在ecosystem.config.js 的app 参数中,我添加了--interpreter 标志来引用当前版本节点的绝对路径:

const index = {
    name: 'index',
    script: '/root/myProject/index.js',

    ...other arguments

    interpreter: "/usr/local/bin/node" // added this line
}

【讨论】:

    猜你喜欢
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 2020-01-01
    相关资源
    最近更新 更多