launching background process in capistrano task

倾然丶 夕夏残阳落幕 提交于 2019-12-18 11:53:59

问题


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


回答1:


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.




回答2:


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




回答3:


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.




回答4:


Try this

run "nohup svscanboot >/tmp/svscanboot.log 2>&1 & sleep 5", pty: false



回答5:


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)


来源:https://stackoverflow.com/questions/10889621/launching-background-process-in-capistrano-task

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!