2012-05-14 3 views
5

Есть ли способ получить статус дочернего процесса процесса на основе его PID в Ruby?Получить статус процесса pid в Ruby

Например, в Python можно сделать psutil.Process (ИДП) .status

+2

Я считаю, что модуль процесса имеет то, что вам нужно в нем: http://www.ruby-doc.org/core-1.9.3/Process.html – vlasits

+0

Какая операционная система вам нужна для этого? – Phrogz

+1

@vlasits Процессный модуль не имеет никакого способа получить состояние запущенного процесса, только выходящие процессы. – dbenhur

ответ

2

Я не знаю портативного метод рубина, чтобы получить процесс состояния запущенного процесса. Вы можете сделать Process.wait и проверить $?.exitstatus, но это не похоже на то, что вы хотите. Для решения Posix, вы могли бы использовать

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

получить буквенный код пс производит для состояния процесса

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

На OS X, я установка строки:

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

затем выполнить в%%:

termoutput=%x[#{outputstring}] 

Я могу показать, что при необходимости, или просто сохранить вывод в чистоте и действовать в состоянии, которое я нашел при вызове.

2

Я искал то же самое. Позор ProcessStatus, похоже, не может быть инициализирован из live pid. Это жизненно важный материал, если вы хотите сделать что-нибудь вроде безопасного приуроченного к дочернему процессу.

В любом случае, это вторая линия в /proc/$pid/status если вы на Linux .: status_line = File.open("/proc/#{pid}/status") {|f| f.gets; f.gets }

Скорее всего гораздо быстрее, чем что-либо с участием внешних программ.

+0

Простое и элегантное решение, чтобы не полагаться на внешние программы (и обстреливать), спасибо. – Navarro