Почему PM2 не запускает мой процесс Node?
Ранее я имел успех в реализации PM2, но не в настоящее время.
Мое приложение узла работает нормально, если я запускаю его вручную, но ничего, что я делаю, не заставляет его работать через PM2, даже если PM2, кажется, запускает его. Вот что я имею в виду:
Если я запускаю pm2 start server / index.js, ответ в терминале будет выглядеть так:
$ pm2 start server/index.js
[PM2] Spawning PM2 daemon with pm2_home=c:\pm2_system\.pm2
[PM2] PM2 Successfully daemonized
[PM2] Starting D:\Program Files\nodeApps\service-management-api\server\index.js in fork_mode (1 instance)
[PM2] Done.*
Затем терминал распечатывает таблицу с информацией о приложении. Это не выглядит приклеенным здесь, поэтому я перечислю это:
App Name: index
id: 0
version: 1.0.0
mode: fork
pid: 8984
status: online
restart: 0
update 0s
cpu: 0%
mem: 26.0 MB
user: ME
watching: disabled
Похоже, что процесс узла должен быть запущен. Но если я сразу ввожу список pm2, он не показывает запущенных процессов. Если я ввожу индекс остановки PM2, он говорит:
$ pm2 stop index
[PM2] Spawning PM2 daemon with pm2_home=c:\pm2_system\.pm2
[PM2] PM2 Successfully daemonized
[PM2][ERROR] Process index not found
В качестве альтернативы, если я попытаюсь использовать ecosystem.config.js в командах, я получу аналогичные результаты. Вот команды, которые попробовали:
pm2 reload ecosystem.config.js
pm2 start ecosystem.config.js
Пример результата выполнения этих команд:
$ pm2 start ecosystem.config.js
[PM2] Spawning PM2 daemon with pm2_home=c:\pm2_system\.pm2
[PM2] PM2 Successfully daemonized
[PM2][WARN] Applications sm_api not running, starting...
[PM2] App [sm_api] launched (2 instances)
И CLI печатает таблицу, показывающую два экземпляра со статусом "онлайн" и просмотром "включено". И все же приложение не запускается (при тестировании из браузера), и выводится "pm2 show":
[PM2] Spawning PM2 daemon with pm2_home=c:\pm2_system\.pm2
[PM2] PM2 Successfully daemonized
[PM2][WARN] <app name> doesn't exist
Какие-нибудь подсказки, что пошло не так с моим pm2?
Вот мой файл ecosystem.config.js:
module.exports = {
apps : [{
name: 'sm_api',
script: 'server/index.js',
"log_date_format" : "YYYY-MM-DD HH:mm Z",
// Options reference: https://pm2.io/doc/en/runtime/reference/ecosystem-file/
args: 'one two',
instances: 'max',
error_file : "C:\\pm2_system\\.pm2\\logs\\sm-api-error",
out_file: "C:\\pm2_system\\.pm2\\logs\\sm-api-out",
autorestart: true,
watch: "../",
max_restarts: 10,
max_memory_restart: '1G',
env: {
NODE_ENV: 'development'
},
env_production: {
NODE_ENV: 'production'
},
exec_mode: 'cluster'
}],
};
Работает в среде Windows Server 2012. Обратите внимание, что я собираюсь добавить пакет pm2-windows-service после того, как я получу работу pm2.
4 ответа
Просто примечание для тех, кто говорит запустить это в no-daemon
Режим, (pm2 start --no-daemon
), вам следует использовать этот режим, если вы пытаетесь диагностировать причину, по которой при запуске с демоном ваш скрипт не работает.
Почти всегда это происходит из-за того, что вы говорите PM2 следить за папкой dist или чем-то подобным, пока она строится, поэтому PM2 продолжает перезапускаться, пока не достигнет своего предела (поскольку файлы регенерируются с довольно высокой скоростью), а затем выдает статус "ошибочный"..
Запуск в no-daemon
категорически не рекомендуется в производстве. Убедитесь, что PM2 запущен как демон, чтобы он мог сам перезапуститься и чтобы он мог перезапустить ваши процессы как сам процесс. Если вы завершите сеансы терминала или они автоматически отключатся по тайм-ауту на вашем хосте, вы быстро обнаружите, что ваша служба умирает, когда это произойдет.
Короче говоря... сделайте это правильно и выясните, в чем проблема, вместо того, чтобы лениться и превращать PM2 в прославленную обертку для node
двоичный.
Хорошо, я получил ответ после публикации проблемы на странице вопросов pm2 github.
Разделите это здесь в случае, если кто-то еще оказывается в этой ситуации:
https://github.com/Unitech/pm2/issues/4113
(В основном, в pm2 3.2.5 появилась ошибка, которая вызывала эту проблему в Windows. Моя QA-установка была 3.2.4. Проблема была решена путем возврата к 3.2.4 в производственном процессе. Простой процесс, см. Инструкции по ссылке выше.)
В качестве обходного пути я использовал следующее:
pm2 start --no-daemon app.js
В моем случае (pm2 v3.2.2):
- pm2 остановить все // остановить все
- rm ./pm2/*.pid //удалить все
- pm2 запустить app.config.js