launching background process in capistrano task

2019-02-03 16:23发布

capistrano task

namespace :service do
  desc "start daemontools (svscan/supervise/svscanboot)"
  task :start, :roles => :app do
    sudo "svscanboot&"
  end
end

Now this doesn't work: the svscanboot process simply doesn't run. This helped me find sleep: https://github.com/defunkt/resque/issues/284 other sources pointed me to nohup, redirection, and pty => true, so I tried all these.

run "nohup svscanboot >/tmp/svscanboot.log 2>&1 &"   # NO
run "(svscanboot&) && sleep 1"                       # NO
run "(nohup svscanboot&) && sleep 1"                 # YES!

Now, could anyone explain to me why i need the sleep statement and what difference does nohup make? For the record all the above run equally well if run from user shell, problem is only in the context of capistrano.

thanks

5条回答
孤傲高冷的网名
2楼-- · 2019-02-03 16:32

My simple solution would be make svscanboot.sh file at remote server with whatever code you want to run. In your case

svscanboot >/tmp/svscanboot.log 2>&1

In cap rake task add this

run "sh +x somefile.sh &"

this works well for me.

查看更多
forever°为你锁心
3楼-- · 2019-02-03 16:35

Try this

run "nohup svscanboot >/tmp/svscanboot.log 2>&1 & sleep 5", pty: false
查看更多
Luminary・发光体
4楼-- · 2019-02-03 16:37

I think nohup just launches the process in background, so you don't need to explicitly set the last &.

Did you try

run "nohup svscanboot >/tmp/svscanboot.log 2>&1"

(without the ending & to send it to the background).

That should work and remain running when your current capistrano session is closed.

查看更多
手持菜刀,她持情操
5楼-- · 2019-02-03 16:40

Try forking the process as explained here: Spawn a background process in Ruby

You should be able to do something like this:

job1 = fork do
  run "svscanboot"
end

Process.detach(job1)

As well, checkout this: Starting background tasks with Capistrano

查看更多
你好瞎i
6楼-- · 2019-02-03 16:57

I'd like to share my solution which also works when executing multiple commands. I tried many other variants found online, including the "sleep N" hack.

run("nohup sh -c 'cd #{release_path} && bundle exec rake task_namespace:task_name RAILS_ENV=production > ~/shared/log/<rakelog>.log &' > /dev/null 2>&1", :pty => true)
查看更多
登录 后发表回答