Parallel::ForkManager handles timeouts and asynchronous processes, although you may have to tweak things around for a good fit with what you are trying to do.
Here is some sample code I threw together last week for a similar issue.
Comment on Re: Read a process output asynchronously