2014-01-04 8 views
14

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

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

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

+0

Возможно, вы захотите установить навсегда сначала и daemonize nodejs; вы можете увидеть здесь некоторую информацию; http://stackoverflow.com/questions/4903570/how-does-one-start-a-node-js-server-as-a-daemon-process –

ответ

25

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

- 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), но это работает пока.

У меня есть полный пример того, как start a Node.js app with Forever and Ansible на блоге сервера Check.in.

+0

Спасибо за это решение. Но это хорошо для запуска приложения один раз. Что делать, если вы хотите повторно установить его снова? Пожалуйста, проверьте мой ответ ниже для небольшого улучшения. –

+0

@QuyenNguyenTuan это довольно просто, просто используйте 'forever restart/path/to/app.js', когда' forever_list.stdout.find ('/ path/to/app.js')! = -1' – smartwjw

+0

Хорошее решение, Я обнаружил, что эти задачи устанавливают 'forever' без каких-либо проблем, но не могут запускать сценарий моего узла. Если я запускаю вручную 'forever start/home/vargrant/project/socket.js', я могу запустить скрипт' socket.js', но если я использую это как часть непонятной ** команды **, он не запускается сценарий. Есть идеи? – outboundexplorer

0

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

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

Лучший подход, однако, может быть попробовать использовать forever так, если приложение завершает он будет автоматически перезагружен.

3

Использование 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 
+0

Вы также можете использовать 'forever restart' или' forever restartall' для сохранения нескольких шагов. – geerlingguy

0

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

process.on('SIGHUP', function() { 
      logger.info("SIGHUP signal was interrupted"); 
     }); 
Смежные вопросы