How To Run Multiple Tasks At Once

898 views
Skip to first unread message

Brian Carpio

unread,
Nov 5, 2011, 8:22:48 AM11/5/11
to Capistrano
Lets say I have the following


desc "my task"
task :my_task, :roles => :cluster do
  run "some command here"
  run "some command here"
  run "some command here"
  run "some command here"
  run "some command here"
  run "some command here"
  run "some command here"
end

When I call my_task each command runs one after the other, is there a
way to make Capistrano run them all at once instead of waiting for the
first one to finish then move to the next one?

Thanks,
Brian

Lee Hambley

unread,
Nov 5, 2011, 8:31:28 AM11/5/11
to capis...@googlegroups.com
No, but you should be able to leverage the features of the underlying shell, and background the process with &.

Brian

--
* You received this message because you are subscribed to the Google Groups "Capistrano" group.
* To post to this group, send email to capis...@googlegroups.com
* To unsubscribe from this group, send email to capistrano+...@googlegroups.com For more options, visit this group at http://groups.google.com/group/capistrano?hl=en

Donovan Bray

unread,
Nov 5, 2011, 1:07:09 PM11/5/11
to capis...@googlegroups.com
You can do anything that your shell can do.

You have to first determine how you want the commands to exit in case one command fails.

run "a;b;c"

In this case all commands will run regardless of exit code, the exit code of the last command only will be returned to cap.

run "a && b && c"

Will run each command but will exit on the first failure

run "cd /a && b; true"

Will exit and not run b if it can't cd into a;
If it can cd into a then it will run b; but it will always report sucess to cap; even if b fails.

Fair warning sudo doesn't allow you to chain execution this way

sudo "cd /a && b; true"

Won't work as expected; but you could rewrite it as a run.

run "cd /a && #{sudo} b; true"

Brian Carpio

unread,
Nov 5, 2011, 3:33:30 PM11/5/11
to capis...@googlegroups.com
I guess I don't want this to be a shell issue, these tasks aren't dependent on one another so I was hoping capistrano could run them all at the same time. What if I separate out each run " command " to its own cap task then can I run cap tasks in parellel?

Thanks,
Brian

Donovan Bray

unread,
Nov 5, 2011, 6:56:42 PM11/5/11
to capis...@googlegroups.com
What difference does it make?

Commands runs serially in order specified, whether you do it via multiple command passed to the shell or not. Each command is sent in parallel via ssh to all servers specified. 

What exactly do you mean in parallel?

Brian Carpio

unread,
Nov 8, 2011, 2:10:45 PM11/8/11
to capis...@googlegroups.com
So I am attempting to reduce the downtime of our deployments, in one such case I umount all database related mount points so I can take a snapshot on the SAN (this is all automated via capistrano using SAN APIs etc..) it would be nice if I could have one cap job which ran all 20 commands at exactly the same time, if that cap command failed I can deal with that in a paret script which controles the remounting of file systems etc... To me that is what "in parallel means" all the "run" tasks run at the same time.

Brian

Lee Hambley

unread,
Nov 8, 2011, 2:41:37 PM11/8/11
to capis...@googlegroups.com
So leverage the power of your shell, you can run() something and pass the appropriate nohup/background command to ask your shell to run it in the background, which will leave cap free to move on to the next run() command, etc.

- Lee

Brian Carpio

unread,
Nov 8, 2011, 2:44:11 PM11/8/11
to capis...@googlegroups.com
The only problem with that is although these 20 tasks aren't dependent on each other the next cap jobs need to wait for them to finish before they can run. I guess I can write in logic in cap to check the status of the jobs that where put into the background, make sure they are finished then run the next cap job. 

Brian

On Tue, Nov 8, 2011 at 12:41 PM, Lee Hambley <lee.h...@gmail.com> wrote:
So leverage the power of your shell, you can run() something and pass the appropriate nohup/background command to ask your shell to run it in the background, which will leave cap free to move on to the next run() command, etc.

- Lee

--

Donovan Bray

unread,
Nov 8, 2011, 10:12:30 PM11/8/11
to capis...@googlegroups.com
You have 20 hosts you want the same command run  OR 20 different commands on the same host?

If it's the former use roles and define all the servers then target the task to that role; if it's the latter then your going to need to push down a bash script that forks subshells;

Donovan Bray

unread,
Nov 8, 2011, 10:16:39 PM11/8/11
to capis...@googlegroups.com
Look into bash and forking; because the you can 'join' after all the forking action and return an overall success or failure to cap before it moves on. 
Reply all
Reply to author
Forward
0 new messages