2012-05-14 8 views
5

Gibt es eine Möglichkeit, den Prozessstatus eines Prozesses basierend auf seiner PID in Ruby abzurufen?Prozessstatus über PID in Ruby abrufen

Zum Beispiel in Python können Sie tun psutil.Process (pid) .status

+2

Ich glaube, dass das Prozessmodul hat, was Sie darin brauchen: http://www.ruby-doc.org/core-1.9.3/Process.html – vlasits

+0

Welche OS (es) benötigen Sie dies zu arbeiten? – Phrogz

+1

@vlasits Prozessmodul hat keine Methode, um den Status des laufenden Prozesses zu erhalten, sondern nur die Prozesse. – dbenhur

Antwort

2

ich eine tragbare Ruby-Methode nicht wissen, Prozesszustand eines laufenden Prozesses zu erhalten. Sie können Process.wait tun und überprüfen Sie $?.exitstatus, aber das sieht nicht wie Sie wollen. Für eine Posix-Lösung, könnten Sie

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

verwenden die Buchstaben-Code ps erzeugt für Prozesszustand

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

Unter OS X ich einen String-Setup zu bekommen: execute

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

dann es in einem% x Anruf:

termoutput=%x[#{outputstring}] 

Ich kann das bei Bedarf anzeigen oder einfach die Ausgabe sauber halten und auf den Zustand reagieren, den ich bei dem Anruf gefunden habe.

2

Ich war auf der Suche nach der gleichen Sache. Es ist eine Schande, dass ProcessStatus nicht von einem Live-Pid initialisiert werden kann. Dies ist wichtig, wenn Sie etwas wie eine sichere zeitgesteuerte Tötung eines Kindprozesses tun wollen.

In jedem Fall es ist die zweite Zeile in /proc/$pid/status, wenn Sie auf Linux sind .: status_line = File.open("/proc/#{pid}/status") {|f| f.gets; f.gets }

Wahrscheinlich viel viel schneller als alles, was ein externes Programm beteiligt ist.

+0

Einfache und elegante Lösung, um sich nicht auf externe Programme (und Beschuss) verlassen zu müssen, danke. – Navarro