在ansible中守护可执行文件

时间:2015-04-22 19:04:30

标签: shell daemon ansible

我正在尝试在ansible中创建一个任务,该任务执行shell命令以使用&在守护进程模式下运行可执行文件。像下面这样的东西

-name: Start daemon
  shell: myexeprogram arg1 arg2 &

如果我保持&任务立即返回,并且该过程未启动。如果我删除& ansible任务等待很长一段时间而不返回。

通过ansible感谢关于以守护进程模式启动程序的正确方法的建议。请注意,我不想将此作为服务运行,而是基于某些条件进行特殊的后台处理。

5 个答案:

答案 0 :(得分:17)

使用'&'运行程序不会使程序成为守护进程,它只是在后台运行。制作一个真正的守护进程"您的程序应该执行here所述的步骤。

如果你的程序是用C语言编写的,你可以调用daemon()函数,它会为你做。然后,即使没有'&'在最后,它将作为一个守护进程运行。

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

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

答案 1 :(得分:11)

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

您可以使用nohup来规避这一点。

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

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

答案 2 :(得分:5)

从您想要实现的内容的简要说明中,听起来最好将您的可执行文件设置为服务(使用Upstart或类似服务),然后根据其他条件根据需要启动/停止它需要它运行(或不运行)。

尝试将此作为一个进程运行,否则将需要捕获PID或类似内容,以便您可以尝试在需要时关闭已启动的守护程序,其复杂程度与安装init配置相同文件将带有和没有像Upstart这样的系统为您提供启动/停止等控制的细节。

答案 3 :(得分:2)

我找到了最好的方法,特别是因为我想记录输出,就是使用“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

答案 4 :(得分:0)

添加到上面的 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标志记录输出。