在ansible中守护可执行文件

Daemonizing an executable in ansible

我正在尝试在 ansible 中创建一个任务,该任务使用 & 在守护进程模式下对 运行 可执行文件执行 shell 命令。喜欢关注

-name: Start daemon
  shell: myexeprogram arg1 arg2 &

我看到的是如果我立即保留 & 任务 returns 并且进程没有启动。如果我删除 & ansible 任务等待很长一段时间而不返回。

感谢有关通过 ansible 以守护进程模式启动程序的正确方法的建议。请注意,我不想 运行 这是一项服务,而是基于特定条件的临时后台进程。

当您(或 Ansible)注销时,退出信号仍将发送到 运行 进程,即使它在后台 运行。

您可以使用 nohup 来规避它。

- name: Start daemon
  shell: nohup myexeprogram arg1 arg2 &

http://en.wikipedia.org/wiki/Nohup

运行 带有“&”的程序不会使程序成为守护进程,它只是在后台运行。要制作 "true daemon",您的程序应该执行 here.

中描述的步骤

如果您的程序是用 C 编写的,您可以调用 daemon() 函数,它将为您完成。然后你可以启动你的程序,即使最后没有'&',它将运行作为守护进程。

另一种选择是使用 daemon 调用您的程序,这也应该可以完成这项工作。

- name: Start daemon
  shell: daemon -- myexeprogram arg1 arg2

根据您想要实现的目标的简要描述,听起来您最好将可执行文件设置为服务(使用 Upstart 或类似服务),然后根据需要 start/stop在要求它是 运行ning(或不是 运行ning)的其他条件下。

尝试 运行 将此作为一个进程,否则将需要捕获 PID 或类似的东西,这样您就可以在需要时尝试关闭已启动的守护进程,而且数量几乎相同安装初始化配置文件的复杂性,并且没有 Upstart 等系统为您提供 start/stop.

等控件的好处

我发现最好的方法是使用 "daemonize" 包,特别是因为我想记录输出。如果你在 CentOS/Redhat,如下所示。可能还有一个适合它的 apt-package。

- name: yum install daemonize
  yum:
    name: daemonize
    state: latest

- name: run in background, log errors and standout to file
  shell:  daemonize -e /var/log/myprocess.log -o /var/log/myprocess.log  /opt/myscripts/myprocess.sh

添加上面的 daemonize 建议,如果你想在特定目录中启动你的程序,你可以这样做:

- name: install daemonize package
  package:
    name: daemonize
    state: latest
- name: start program
  command: daemonize -c /folder/to/run/in /path/to/myexeprogram arg1 arg2

值得注意的是,您可能还需要 -e -o 标志来记录输出。