2016-11-25 40 views
0

运行我有一个systemd服务连接到服务器consul我春天启动的应用程序,背后haproxyconsul提供consul-template经由consul-template命令自动更新haproxy配置文件中的服务位置。让ExecStartPost命令在后台

consul-template需要一个模板文件并写入最终的haproxy配置文件,然后重新加载haproxy

现在,consul-template进程需要始终与我的应用程序一起在后台运行,以便随着应用程序启动,它可以检测到新的应用程序启动并更新其在配置文件中的位置。

下面是该我systemd服务文件。

[Unit] 
Description=myservice 
Requires=network-online.target 
After=network-online.target 

[Service] 
Type=forking 
PIDFile=/home/dragon/myservice/run/myservice.pid 
ExecStart=/home/dragon/myservice/bin/myservice-script start 
ExecReload=/home/dragon/myservice/bin/myservice-script reload 
ExecStop=/home/dragon/myservice/bin/myservice-script stop 
ExecStartPost=consul-template -template '/etc/haproxy/haproxy.cfg.template:/etc/haproxy/haproxy.cfg:sudo systemctl reload haproxy' 
User=dragon 

[Install] 
WantedBy=multi-user.target 

现在,当我开始systemctl start myservice,我的应用程序启动并调用consul-template也可以,但是consul-template过程不会在后台去。我必须按Ctl+C然后systemctl回来,我有我的两个应用和领事模板进程运行。

有没有办法运行在ExecStartPost指定在后台consul-template过程?

我试图在ExecStartPost命令的末尾添加&,但随后consul-template抱怨说,它是一个额外的无效参数,它失败。

我也试图使命令/bin/sh -c "consul-template command here...",但后来这也不起作用。即使nohup在此命令中也不起作用。

任何帮助非常感谢。

+0

你可能与'领事template'过程中分离到自己更成功系统单元。 – Amir

回答

1

一种解决方法是将有一个bash文件作为入口点,加入所有你有需要的话,都将神奇的工作

+0

我最终为consul-template创建了一个单独的服务,并使用consul的键值对创建了一个自我渲染模板文件。 – divinedragon

+0

领事真棒! :)率,如果你认为我实际上在某种方式帮助:) –

+0

我将提交我的答案。这对很多人都有用。 – divinedragon