Ansible在启动node.js服务器时挂起

我想开始我的node.js应用程序在一个完整的剧本。 现在,最后的指令看起来像这样:

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

问题是,不可能从这个回报。 我怎样才能让它继续下去?

永远似乎是启动和守护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" 

这是完全幂等的,对我很好。 你可以为Ansible编写一个forever模块来为你做这个东西(比如service模块),但是现在这个模块可以工作。

我有一个完整的例子,介绍如何在Server Check.in的博客上使用Forever和Ansible启动一个Node.js应用程序 。

使用Forever是在后台运行nodejs应用程序的最佳解决scheme。 @geerlingguy的解决scheme非常适合运行一次应用程序,但是如果要重新部署应用程序,则必须先停止服务器,然后重新启动它:

 - 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 

尝试使用nohup:

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

然而,更好的方法可能是永久使用,所以如果应用程序终止,它将自动重启。

当你closuresshell时,进程会得到SIGHUP信号(如kill -1)。 你可以在你的app.js文件中捕捉到信号“SIGHUP”。

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