# Process#poll

**URL:** <https://www.ruby-forum.com/t/process-poll/174761>\
**Category:** Ruby\
**Created:** [September 1, 2009, 11:31pm UTC](https://www.ruby-forum.com/t/process-poll/174761 "2009-09-01T23:31:47Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![rogerdpack](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/45deac/32.png) [@rogerdpack](https://www.ruby-forum.com/u/rogerdpack)\
**Post date:** [September 1, 2009, 11:31pm UTC](https://www.ruby-forum.com/t/process-poll/174761/1 "2009-09-01T23:31:47Z")

</div>

Question.

Situation:  
I want to start a process, then loop, checking for its status, so that I  
can “know” when it finishes, and not block the Tk.mainloop.

Anybody know how to determine runningness of a process in ruby?  
Thanks!

---

<div class="post-metadata">

**Author:** ![rogerdpack](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/45deac/32.png) [@rogerdpack](https://www.ruby-forum.com/u/rogerdpack)\
**Post date:** [September 2, 2009, 12:02am UTC](https://www.ruby-forum.com/t/process-poll/174761/2 "2009-09-02T00:02:11Z")

</div>

Roger P. wrote:

> Question.
> 
> Situation:  
> I want to start a process, then loop, checking for its status, so that I  
> can “know” when it finishes, and not block the Tk.mainloop.
> 
> Anybody know how to determine runningness of a process in ruby?  
> Thanks!

Don’t the Process.wait family of methods do what you want? Maybe:

Process.waitpid(pid, Process::WNOHANG)

---

<div class="post-metadata">

**Author:** ![rogerdpack](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/45deac/32.png) [@rogerdpack](https://www.ruby-forum.com/u/rogerdpack)\
**Post date:** [September 2, 2009, 12:12am UTC](https://www.ruby-forum.com/t/process-poll/174761/3 "2009-09-02T00:12:07Z")

</div>

I could possibly add something like this to Rev, although you would only  
be  
able to receive the events when you’re running a Rev event loop, and MRI  
may  
swallow SIGCHLD.

---

<div class="post-metadata">

**Author:** ![rogerdpack](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/45deac/32.png) [@rogerdpack](https://www.ruby-forum.com/u/rogerdpack)\
**Post date:** [September 2, 2009, 2:11am UTC](https://www.ruby-forum.com/t/process-poll/174761/4 "2009-09-02T02:11:27Z")

</div>

Joel VanderWerf wrote:

> Roger P. wrote:
> 
> > Question.
> > 
> > Situation:  
> > I want to start a process, then loop, checking for its status, so that I  
> > can “know” when it finishes, and not block the Tk.mainloop.
> > 
> > Anybody know how to determine runningness of a process in ruby?  
> > Thanks!
> 
> Don’t the Process.wait family of methods do what you want? Maybe:
> 
> Process.waitpid(pid, Process::WNOHANG)

Interesting. I think that that’s what Python’s Process#poll uses  
internally. Unfortunately it appears that both it and Process::WNOHANG  
and Linux only (I’m on doze). Hmm.  
-r

---

<div class="post-metadata">

**Author:** ![rogerdpack](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/45deac/32.png) [@rogerdpack](https://www.ruby-forum.com/u/rogerdpack)\
**Post date:** [September 2, 2009, 2:35am UTC](https://www.ruby-forum.com/t/process-poll/174761/5 "2009-09-02T02:35:37Z")

</div>

Roger P. wrote:

> > Don’t the Process.wait family of methods do what you want? Maybe:
> > 
> > Process.waitpid(pid, Process::WNOHANG)
> 
> Interesting. I think that that’s what Python’s Process#poll uses  
> internally. Unfortunately it appears that both it and Process::WNOHANG  
> and Linux only (I’m on doze). Hmm.  
> -r

The win32-process gem claims to handle some of that functionality…

---

<div class="post-metadata">

**Author:** ![rogerdpack](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/45deac/32.png) [@rogerdpack](https://www.ruby-forum.com/u/rogerdpack)\
**Post date:** [September 2, 2009, 4:19am UTC](https://www.ruby-forum.com/t/process-poll/174761/6 "2009-09-02T04:19:50Z")

</div>

Roger P. wrote:

> Works for me 🙂  
> -r

If you’re going to fire up a thread (as in Timeout), you could also do  
something like this (maybe a bit more efficient):

done = false  
Thread.new {Process.wait(a.pid); done = true}  
loop do

# …

if done  
# …  
end  
end

(I hope that doesn’t fail on windows, but didn’t test it…)

---

<div class="post-metadata">

**Author:** ![rogerdpack](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/45deac/32.png) [@rogerdpack](https://www.ruby-forum.com/u/rogerdpack)\
**Post date:** [September 2, 2009, 3:05am UTC](https://www.ruby-forum.com/t/process-poll/174761/7 "2009-09-02T03:05:33Z")

</div>

> The win32-process gem claims to handle some of that functionality…

It probably does give some hints as to how one could accomplish this  
[not waiting for INFINITY, for example].  
[http://allgems.ruby-forum.com/gems/doc/win32-process/0.6.0](http://allgems.ruby-forum.com/gems/doc/win32-process/0.6.0)

I did figure out a way that appears to work in windows, for any  
followers…

[http://betterlogic.com/roger/?p=1900](http://betterlogic.com/roger/?p=1900)

Works for me 🙂  
-r
