First: use MacRuby. The latest MacRuby has built-in Grand Central built-in scheduling - that Spiffiness Snow Leopard automatically manages multicore streams, etc. You may not need this, but if you know that it will only work on a Mac, why not?
Secondly: get the Pickaxe 1.9 publisher version (which programs Ruby 1.9) and read the entire chapter on threads, fibers, and processes.
Third: adapt what you learn to your needs, but I would probably approach this problem by unscrewing a new Thread for each task and then running a system or `backtick` call for each utility in its own thread. Ruby 1.9 has real threads (and MacRuby has the best ones), so they all work right away - and locking the interpreter doesn't matter at all if you mostly expect external processes.
(If you did not need to pay attention to the results of the calls and did not need to quote, the Pickaxe exec('foo') if fork.nil? would be even simpler. I have used it many times for things like support for creating multiple directories at once and etc.)
The Colin EventMachine proposal will also work as fast as you could if you implemented it correctly (and if your workflow made sense for events with asynchronous I / O), but would be much more complex and difficult. Since you are not trying to scale the entire universe, you just want to perform some local tasks, I think that threads will do their best and make for simpler, more readable and maintainable code.
source share