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


#1

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


#2

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 H.


#3

Park H. 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 H.

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