2012-05-14 23 views
5

¿Hay alguna manera de obtener el estado del proceso secundario de un proceso basado en su PID en Ruby?Obtenga el estado del proceso por pid en Ruby

Por ejemplo, en Python que puede hacer psutil.Process (PID) .status

+2

Creo que el Módulo de proceso tiene lo que necesita en él: http://www.ruby-doc.org/core-1.9.3/Process.html – vlasits

+0

¿Qué sistema operativo (OS) necesita para que esto funcione? – Phrogz

+1

@vlasits El módulo de proceso no tiene ningún método para obtener el estado del proceso en ejecución, solo los procesos salidos. – dbenhur

Respuesta

2

No sé de un método de rubí portátil para obtener el estado del proceso de un proceso en ejecución. Puede hacer Process.wait y marcar $?.exitstatus, pero eso no se parece a lo que quiere. Para una solución POSIX, se puede usar

`ps -o=state= -p #{pid}`.chomp 

para obtener el ps código de letras produce para el estado del proceso

PROCESS STATE CODES 
Here are the different values that the s, stat and state output specifiers 
(header "STAT" or "S") will display to describe the state of a process. 
D Uninterruptible sleep (usually IO) 
R Running or runnable (on run queue) 
S Interruptible sleep (waiting for an event to complete) 
T Stopped, either by a job control signal or because it is being traced. 
W paging (not valid since the 2.6.xx kernel) 
X dead (should never be seen) 
Z Defunct ("zombie") process, terminated but not reaped by its parent. 
0

En OS X, I fijó una cadena:

outputstring="ps -O=S -p #{mypid}" 

luego ejecutar en una llamada% x:

termoutput=%x[#{outputstring}] 

Puedo mostrar eso si es necesario, o simplemente mantener el resultado limpio y actuar en el estado que encontré con la llamada.

2

Estaba buscando lo mismo. Es una pena que ProcessStatus no parezca ser inicializado desde un pid en vivo. Esto es vital si quieres hacer algo como matar a tiempo de manera segura a un proceso hijo.

En cualquier caso, es la segunda línea en /proc/$pid/status si estás en Linux .: status_line = File.open("/proc/#{pid}/status") {|f| f.gets; f.gets }

Lo más probable es mucho, mucho más rápido que cualquier cosa que implica un programa externo.

+0

Solución simple y elegante para evitar depender de programas externos (y desembolsos), gracias. – Navarro

Cuestiones relacionadas