Ansible зависает при запуске сервера node.js

Я хотел бы запустить мое приложение node.js в незанятой пьесе. Прямо сейчас, окончательная директива выглядит следующим образом:

  - name: start node server
    shell: chdir=${app_path} npm start&

Проблема в том, что от этого никогда не возвращается ansible. Как я могу продолжить?

Ответ 1

Forever кажется самым простым и простым способом запуска и демонстрации приложений Node.js. В настоящее время нет никакого модуля Ansible навсегда, но вы все равно можете использовать следующие игры для установки навсегда и запускать свое приложение:

- name: "Install forever (to run Node.js app)."
  npm: name=forever global=yes state=present

- name: "Check list of Node.js apps running."
  command: forever list
  register: forever_list
  changed_when: false

- name: "Start example Node.js app."
  command: forever start /path/to/app.js
  when: "forever_list.stdout.find('/path/to/app.js') == -1"

Это полностью идемпотент, и отлично работает для меня. Вы можете запрограммировать небольшой модуль forever для Ansible, чтобы сделать это для вас (например, модуль service), но это работает пока.

У меня есть полный пример того, как запустить приложение Node.js с Forever and Ansible в блоге Server Check.in.

Ответ 2

Использование Forever - лучшее решение для запуска приложения nodejs в фоновом режиме. Решение @geerlingguy отлично подходит для запуска приложения один раз, но если вы хотите повторно развернуть приложение, вы должны сначала остановить сервер, а затем запустить его снова:

- name: Get app process id
  shell: "ps aux | grep app.js | grep -v grep | awk '{print $2}'"
  register: process_id

- name: Stop app process
  shell: kill -9 {{ item }}
  with_items: process_id.stdout_lines
  ignore_errors: True  # Ignore error when no process running

- name: Start application
  command: forever start path/to/app.js
  environment:
    NODE_ENV: production  # Use this if you want to deploy the app in production

Ответ 3

Попробуйте использовать nohup:

- name: start node server
  shell: chdir=${app_path} nohup npm start &

Однако лучшим способом может быть использование forever, поэтому, если приложение завершает работу, он перезапустится автоматически.

Ответ 4

когда вы закрываете оболочку, процесс получает сигнал SIGHUP (например, kill -1). вы можете поймать сигнал "SIGHUP" в файле app.js.

process.on('SIGHUP', function() {
            logger.info("SIGHUP signal was interrupted");
        });