2012-05-14 28 views
5

Có cách nào để có được trạng thái tiến trình con của quá trình dựa trên PID của nó trong Ruby không?Nhận trạng thái xử lý bằng pid trong Ruby

Ví dụ, trong Python bạn có thể làm psutil.Process (pid) .status

+2

Tôi tin rằng Mô-đun quy trình có những gì bạn cần trong đó: http://www.ruby-doc.org/core-1.9.3/Process.html – vlasits

+0

Bạn cần hệ điều hành này để làm việc? – Phrogz

+1

@vlasits Mô-đun quy trình không có bất kỳ phương pháp nào để nhận trạng thái quy trình đang chạy, chỉ các quy trình đã thoát. – dbenhur

Trả lời

2

Tôi không biết của một phương pháp ruby ​​di động để có được quá trình trạng thái của một quá trình đang chạy. Bạn có thể làm Process.wait và kiểm tra $?.exitstatus, nhưng điều đó không giống như những gì bạn muốn. Đối với một giải pháp posix, bạn có thể sử dụng

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

để lấy mã thư ps sản xuất cho nhà nước quá trình

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

Trên OS X, tôi thiết lập một chuỗi:

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

sau đó thực hiện nó trong cuộc gọi% x:

termoutput=%x[#{outputstring}] 

Tôi có thể hiển thị rằng nếu cần thiết, hoặc chỉ giữ cho đầu ra sạch sẽ và hành động trên Nhà nước tôi tìm thấy với các cuộc gọi.

2

Tôi đang tìm kiếm điều tương tự. Đó là một ProcessStatus đáng xấu hổ dường như không thể khởi tạo từ một pid trực tiếp. Đây là công cụ quan trọng nếu bạn muốn làm bất cứ điều gì giống như một giết thời gian an toàn của một quá trình con.

Trong mọi trường hợp, đó là dòng thứ hai trong /proc/$pid/status nếu bạn đang ở trên Linux .: status_line = File.open("/proc/#{pid}/status") {|f| f.gets; f.gets }

Nhiều khả năng nhanh hơn nhiều so với bất cứ điều gì liên quan đến một chương trình bên ngoài.

+0

Giải pháp đơn giản và thanh lịch để tránh dựa vào các chương trình bên ngoài (và bắn phá), cảm ơn bạn. – Navarro

Các vấn đề liên quan