我想在 ansible playbook 中启动我的 node.js 应用程序。现在,最终指令如下所示:
- name: start node server
shell: chdir=${app_path} npm start&
问题是 ansible 永远不会从这里返回。我怎样才能让它继续?
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"
这是完全幂等的,对我很有用。你可以为 Ansible 编写一个小forever
模块来为你做这些事情(就像service
模块一样),但现在这工作。
我在 Server Check.in 的博客上有一个完整的示例,说明如何使用 Forever 和 Ansible 启动 Node.js 应用程序。
Using Forever is the best solution for running nodejs app in background. The solution of @geerlingguy is great for running the app once, but if you want to re-deploy the app, you must stop the server first, and then start it again:
- 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 &
但是,更好的方法可能是尝试永远使用,因此如果应用程序终止,它将自动重新启动。
当你关闭 shell 时,进程会收到 SIGHUP 信号(如 kill -1)。您可以在 app.js 文件中捕获信号“SIGHUP”。
process.on('SIGHUP', function() {
logger.info("SIGHUP signal was interrupted");
});