|Just another Perl shrine|
Re: Killing a process on Windows (Win32::Process question)by tokpela (Chaplain)
|on May 14, 2009 at 09:10 UTC||Need Help??|
I think you might want to look at Win32::Job
This module will allow you to create process which can contain subprocesses. The module contains the ability to timeout after a period of time and then allows you to kill the process (and subprocesses).
From the documentation:
Windows 2000 introduced the concept of a "job": a collection of processes which can be controlled as a single unit. For example, you can reliably kill a process and all of its children by launching the process in a job, then telling Windows to kill all processes in the job. Win32::Job makes this feature available to Perl.
For example, imagine you want to allow 2 minutes for a process to complete. If you have control over the child process, you can probably just run it in the background, then poll every second to see if it has finished.
That's fine as long as the child process doesn't spawn any child processes. What if it does? If you wrote the child process yourself and made an effort to clean up your child processes before terminating, you don't have to worry. If not, you will leave hanging processes (called "zombie" processes in Unix).
With Win32::Job, just create a new Job, then use the job to spawn the child process. All its children will also be created in the new Job. When you time out, just call the job's kill() method and the entire process tree will be terminated.