Перезапуск pm2 из cron/shellJS - ошибка версии bcrypt

Я пытаюсь настроить процесс crontab в Ubuntu 18.04, чтобы периодически проверять состояние pm2 и при необходимости перезапускать его. Поскольку я лучше знаком с JavaScript, я решил, что процесс crontab запускает файл узла, который получает данные JSON от pm2 для проверки состояния каждого приложения в pm2. Если обнаружены какие-либо проблемы, файл JS выполнит другой скрипт bash, используя shellJS. Такие дела:

  1. Кронтаб
  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

И снова запуск именно этой команды работает нормально.

ОБНОВЛЕНИЕ:

Я попытался запустить скрипт bash непосредственно из cron, и я также получаю сообщение об ошибке. Так что, по-видимому, ошибка вызвана не shellJS/node, а что-то в контексте cron.


person SuperCodeBrah    schedule 25.10.2019    source источник
comment
Вы случайно не используете диспетчер версий узлов, например n, nvm или nvs?   -  person fardjad    schedule 26.10.2019
comment
Я смог найти его и добавил ответ. Я не уверен, на какую другую версию узла он может ссылаться, кроме той, что находится в /usr/local/bin/node, но, похоже, это решает проблему.   -  person SuperCodeBrah    schedule 26.10.2019


Ответы (1)


Я придумал решение. При тестировании сценария bash я заметил, что мне нужно убедиться, что у меня есть абсолютные ссылки на пути в файле ecosystem.config.js, чтобы он работал из сценария bash/cron. По-видимому, этот файл также нуждается в абсолютной ссылке на версию узла. По какой-то причине это нужно только при вызове из cron.

Поэтому в аргументах приложения в ecosystem.config.js я добавил флаг --interpreter для ссылки на абсолютный путь к текущей версии узла:

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

    ...other arguments

    interpreter: "/usr/local/bin/node" // added this line
}
person SuperCodeBrah    schedule 25.10.2019