Forum: Ruby Re: win32-open3 module: giving a name to a Process

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Jatinder Singh (Guest)
on 2006-06-13 06:40
(Received via mailing list)
Hi,

Now I need to create a process with a name(the process is an instance of
webrick server).
I can create a webrick instance using following command,(this is not a
blocking call, it returns immediately..thats what I want)
input, out, err, @pid = Open4.popen4('D:\ruby\bin\ruby
C:\InstantRails\rails_apps\app1\script\server -p 3002')

Now at later point of time I would like to kill this process which I can
ofcourse do using
Process.kill(9, @pid)

It may very well happen that process was killed externally, hence in
that
case I am first finding out if process with @pid is still alive by
calling
Process.kill(0,@pid) (it gives an error it the process is not alive,
which I
am catching)

My assumption in above case is that the webrick instance I had created
earlier using popen4 method is still running with @pid; it may very well
happen that webrick instance was killed externally and @pid was taken up
by
some other process; this will result in killing of a innocent process.
I was thinking if I could assign a name to a process and then later on
while
killing, verify the name, then that would solve the problem.
But how do I assign a name to a process while creating a process using
popen4 method and then how do I find the pid of a process by name.


Help is appreciated!

Regards,
Jatinder
Park Heesob (Guest)
on 2006-06-13 08:40
(Received via mailing list)
Hi,

>I can create a webrick instance using following command,(this is not a
>Process.kill(0,@pid) (it gives an error it the process is not alive, which
>But how do I assign a name to a process while creating a process using
>popen4 method and then how do I find the pid of a process by name.
>
>
>Help is appreciated!
>
How about this:

def get_cmd(pid)
  require 'win32ole'
  procs = WIN32OLE.connect("winmgmts:\\\\.")
  procs.ExecQuery(
"SELECT CommandLine FROM Win32_Process WHERE ProcessId = #{pid}
","WQL").each { |p|
    return p.CommandLine
  }
end

cmd = 'D:\ruby\bin\ruby C:\InstantRails\rails_apps\app1\script\server -p
3002'
input, out, err, @pid = Open4.popen4(cmd)

if cmd == get_cmd(@pid)
  puts "Valid Process"
  Process.kill(0,@pid)
else
  puts "Invalid Process"
end



Regards,
Park Heesob
2714e05018e549d252754fd77dacc9e1?d=identicon&s=25 Reggie M. (rpw)
on 2006-06-13 10:16
Park Heesob wrote:
> Hi,
>
>>I can create a webrick instance using following command,(this is not a
>>Process.kill(0,@pid) (it gives an error it the process is not alive, which
>>But how do I assign a name to a process while creating a process using
>>popen4 method and then how do I find the pid of a process by name.
>>
>>
>>Help is appreciated!
>>
> How about this:
>
> def get_cmd(pid)
>   require 'win32ole'
>   procs = WIN32OLE.connect("winmgmts:\\\\.")
>   procs.ExecQuery(
> "SELECT CommandLine FROM Win32_Process WHERE ProcessId = #{pid}
> ","WQL").each { |p|
>     return p.CommandLine
>   }
> end
>
> cmd = 'D:\ruby\bin\ruby C:\InstantRails\rails_apps\app1\script\server -p
> 3002'
> input, out, err, @pid = Open4.popen4(cmd)
>
> if cmd == get_cmd(@pid)
>   puts "Valid Process"
>   Process.kill(0,@pid)
> else
>   puts "Invalid Process"
> end
>
>
>
> Regards,
> Park Heesob

I think he wants to kill it ONLY if his application started it...

require 'win32ole'

def is_server_running(pid)

   running = false
   my_pid = Process.pid
   procs = WIN32OLE.connect("winmgmts:\\\\.")
   #if a record is returned, we know that OUR process is still running
   running = (procs.ExecQuery("SELECT CommandLine FROM Win32_Process
WHERE ParentProcessId = #{my_pid} AND ProcessId = #{pid} ","WQL").count
>= 1)

   return running
 end

  #CHANGE THIS LINE TO THE PID OF YOUR PROCESS
  pid = 4764;

 if is_server_running(pid)
   puts "Valid Process"
   Process.kill(9,pid)
 else
   puts "Invalid Process"
 end
This topic is locked and can not be replied to.